Contents of /trunk/kernel-magellan/patches-3.6/0100-3.6.1-all-fixes.patch
Parent Directory | Revision Log
Revision 1921 -
(show annotations)
(download)
Fri Oct 26 08:33:00 2012 UTC (11 years, 11 months ago) by niro
File size: 75168 byte(s)
Fri Oct 26 08:33:00 2012 UTC (11 years, 11 months ago) by niro
File size: 75168 byte(s)
-3.6.3-magellan-r1
1 | diff --git a/arch/arm/plat-omap/include/plat/omap-serial.h b/arch/arm/plat-omap/include/plat/omap-serial.h |
2 | index 1a52725..3a57644 100644 |
3 | --- a/arch/arm/plat-omap/include/plat/omap-serial.h |
4 | +++ b/arch/arm/plat-omap/include/plat/omap-serial.h |
5 | @@ -42,10 +42,10 @@ |
6 | #define OMAP_UART_WER_MOD_WKUP 0X7F |
7 | |
8 | /* Enable XON/XOFF flow control on output */ |
9 | -#define OMAP_UART_SW_TX 0x04 |
10 | +#define OMAP_UART_SW_TX 0x8 |
11 | |
12 | /* Enable XON/XOFF flow control on input */ |
13 | -#define OMAP_UART_SW_RX 0x04 |
14 | +#define OMAP_UART_SW_RX 0x2 |
15 | |
16 | #define OMAP_UART_SYSC_RESET 0X07 |
17 | #define OMAP_UART_TCR_TRIG 0X0F |
18 | diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c |
19 | index 46b77ed..a7c6d6a 100644 |
20 | --- a/drivers/char/ttyprintk.c |
21 | +++ b/drivers/char/ttyprintk.c |
22 | @@ -67,7 +67,7 @@ static int tpk_printk(const unsigned char *buf, int count) |
23 | tmp[tpk_curr + 1] = '\0'; |
24 | printk(KERN_INFO "%s%s", tpk_tag, tmp); |
25 | tpk_curr = 0; |
26 | - if (buf[i + 1] == '\n') |
27 | + if ((i + 1) < count && buf[i + 1] == '\n') |
28 | i++; |
29 | break; |
30 | case '\n': |
31 | diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c |
32 | index 47408e8..d10c987 100644 |
33 | --- a/drivers/firmware/efivars.c |
34 | +++ b/drivers/firmware/efivars.c |
35 | @@ -435,12 +435,23 @@ efivar_attr_read(struct efivar_entry *entry, char *buf) |
36 | if (status != EFI_SUCCESS) |
37 | return -EIO; |
38 | |
39 | - if (var->Attributes & 0x1) |
40 | + if (var->Attributes & EFI_VARIABLE_NON_VOLATILE) |
41 | str += sprintf(str, "EFI_VARIABLE_NON_VOLATILE\n"); |
42 | - if (var->Attributes & 0x2) |
43 | + if (var->Attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS) |
44 | str += sprintf(str, "EFI_VARIABLE_BOOTSERVICE_ACCESS\n"); |
45 | - if (var->Attributes & 0x4) |
46 | + if (var->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) |
47 | str += sprintf(str, "EFI_VARIABLE_RUNTIME_ACCESS\n"); |
48 | + if (var->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) |
49 | + str += sprintf(str, "EFI_VARIABLE_HARDWARE_ERROR_RECORD\n"); |
50 | + if (var->Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) |
51 | + str += sprintf(str, |
52 | + "EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS\n"); |
53 | + if (var->Attributes & |
54 | + EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) |
55 | + str += sprintf(str, |
56 | + "EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS\n"); |
57 | + if (var->Attributes & EFI_VARIABLE_APPEND_WRITE) |
58 | + str += sprintf(str, "EFI_VARIABLE_APPEND_WRITE\n"); |
59 | return str - buf; |
60 | } |
61 | |
62 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
63 | index 8bcd168..5de3bb3 100644 |
64 | --- a/drivers/hid/hid-core.c |
65 | +++ b/drivers/hid/hid-core.c |
66 | @@ -757,6 +757,7 @@ int hid_open_report(struct hid_device *device) |
67 | struct hid_item item; |
68 | unsigned int size; |
69 | __u8 *start; |
70 | + __u8 *buf; |
71 | __u8 *end; |
72 | int ret; |
73 | static int (*dispatch_type[])(struct hid_parser *parser, |
74 | @@ -775,12 +776,21 @@ int hid_open_report(struct hid_device *device) |
75 | return -ENODEV; |
76 | size = device->dev_rsize; |
77 | |
78 | + buf = kmemdup(start, size, GFP_KERNEL); |
79 | + if (buf == NULL) |
80 | + return -ENOMEM; |
81 | + |
82 | if (device->driver->report_fixup) |
83 | - start = device->driver->report_fixup(device, start, &size); |
84 | + start = device->driver->report_fixup(device, buf, &size); |
85 | + else |
86 | + start = buf; |
87 | |
88 | - device->rdesc = kmemdup(start, size, GFP_KERNEL); |
89 | - if (device->rdesc == NULL) |
90 | + start = kmemdup(start, size, GFP_KERNEL); |
91 | + kfree(buf); |
92 | + if (start == NULL) |
93 | return -ENOMEM; |
94 | + |
95 | + device->rdesc = start; |
96 | device->rsize = size; |
97 | |
98 | parser = vzalloc(sizeof(struct hid_parser)); |
99 | diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c |
100 | index dedd8e4..8e0c4bf94 100644 |
101 | --- a/drivers/hid/usbhid/hid-core.c |
102 | +++ b/drivers/hid/usbhid/hid-core.c |
103 | @@ -1415,20 +1415,20 @@ static int hid_post_reset(struct usb_interface *intf) |
104 | * configuration descriptors passed, we already know that |
105 | * the size of the HID report descriptor has not changed. |
106 | */ |
107 | - rdesc = kmalloc(hid->rsize, GFP_KERNEL); |
108 | + rdesc = kmalloc(hid->dev_rsize, GFP_KERNEL); |
109 | if (!rdesc) { |
110 | dbg_hid("couldn't allocate rdesc memory (post_reset)\n"); |
111 | return 1; |
112 | } |
113 | status = hid_get_class_descriptor(dev, |
114 | interface->desc.bInterfaceNumber, |
115 | - HID_DT_REPORT, rdesc, hid->rsize); |
116 | + HID_DT_REPORT, rdesc, hid->dev_rsize); |
117 | if (status < 0) { |
118 | dbg_hid("reading report descriptor failed (post_reset)\n"); |
119 | kfree(rdesc); |
120 | return 1; |
121 | } |
122 | - status = memcmp(rdesc, hid->rdesc, hid->rsize); |
123 | + status = memcmp(rdesc, hid->dev_rdesc, hid->dev_rsize); |
124 | kfree(rdesc); |
125 | if (status != 0) { |
126 | dbg_hid("report descriptor changed\n"); |
127 | diff --git a/drivers/infiniband/hw/qib/qib_keys.c b/drivers/infiniband/hw/qib/qib_keys.c |
128 | index e9486c7..81c7b73 100644 |
129 | --- a/drivers/infiniband/hw/qib/qib_keys.c |
130 | +++ b/drivers/infiniband/hw/qib/qib_keys.c |
131 | @@ -186,8 +186,9 @@ int qib_lkey_ok(struct qib_lkey_table *rkt, struct qib_pd *pd, |
132 | goto bail; |
133 | |
134 | off = sge->addr - mr->user_base; |
135 | - if (unlikely(sge->addr < mr->iova || off + sge->length > mr->length || |
136 | - (mr->access_flags & acc) == 0)) |
137 | + if (unlikely(sge->addr < mr->user_base || |
138 | + off + sge->length > mr->length || |
139 | + (mr->access_flags & acc) != acc)) |
140 | goto bail; |
141 | if (unlikely(!atomic_inc_not_zero(&mr->refcount))) |
142 | goto bail; |
143 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c |
144 | index 1e19b5a..ea0dfc7 100644 |
145 | --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c |
146 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c |
147 | @@ -150,7 +150,7 @@ static int ipoib_stop(struct net_device *dev) |
148 | |
149 | netif_stop_queue(dev); |
150 | |
151 | - ipoib_ib_dev_down(dev, 0); |
152 | + ipoib_ib_dev_down(dev, 1); |
153 | ipoib_ib_dev_stop(dev, 0); |
154 | |
155 | if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { |
156 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c |
157 | index 7536724..cecb98a 100644 |
158 | --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c |
159 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c |
160 | @@ -175,7 +175,9 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, |
161 | |
162 | mcast->mcmember = *mcmember; |
163 | |
164 | - /* Set the cached Q_Key before we attach if it's the broadcast group */ |
165 | + /* Set the multicast MTU and cached Q_Key before we attach if it's |
166 | + * the broadcast group. |
167 | + */ |
168 | if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4, |
169 | sizeof (union ib_gid))) { |
170 | spin_lock_irq(&priv->lock); |
171 | @@ -183,10 +185,17 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, |
172 | spin_unlock_irq(&priv->lock); |
173 | return -EAGAIN; |
174 | } |
175 | + priv->mcast_mtu = IPOIB_UD_MTU(ib_mtu_enum_to_int(priv->broadcast->mcmember.mtu)); |
176 | priv->qkey = be32_to_cpu(priv->broadcast->mcmember.qkey); |
177 | spin_unlock_irq(&priv->lock); |
178 | priv->tx_wr.wr.ud.remote_qkey = priv->qkey; |
179 | set_qkey = 1; |
180 | + |
181 | + if (!ipoib_cm_admin_enabled(dev)) { |
182 | + rtnl_lock(); |
183 | + dev_set_mtu(dev, min(priv->mcast_mtu, priv->admin_mtu)); |
184 | + rtnl_unlock(); |
185 | + } |
186 | } |
187 | |
188 | if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { |
189 | @@ -574,14 +583,6 @@ void ipoib_mcast_join_task(struct work_struct *work) |
190 | return; |
191 | } |
192 | |
193 | - priv->mcast_mtu = IPOIB_UD_MTU(ib_mtu_enum_to_int(priv->broadcast->mcmember.mtu)); |
194 | - |
195 | - if (!ipoib_cm_admin_enabled(dev)) { |
196 | - rtnl_lock(); |
197 | - dev_set_mtu(dev, min(priv->mcast_mtu, priv->admin_mtu)); |
198 | - rtnl_unlock(); |
199 | - } |
200 | - |
201 | ipoib_dbg_mcast(priv, "successfully joined all multicast groups\n"); |
202 | |
203 | clear_bit(IPOIB_MCAST_RUN, &priv->flags); |
204 | diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c |
205 | index 1b5b0c7..922d845 100644 |
206 | --- a/drivers/infiniband/ulp/srp/ib_srp.c |
207 | +++ b/drivers/infiniband/ulp/srp/ib_srp.c |
208 | @@ -638,9 +638,9 @@ static void srp_reset_req(struct srp_target_port *target, struct srp_request *re |
209 | struct scsi_cmnd *scmnd = srp_claim_req(target, req, NULL); |
210 | |
211 | if (scmnd) { |
212 | + srp_free_req(target, req, scmnd, 0); |
213 | scmnd->result = DID_RESET << 16; |
214 | scmnd->scsi_done(scmnd); |
215 | - srp_free_req(target, req, scmnd, 0); |
216 | } |
217 | } |
218 | |
219 | @@ -1687,6 +1687,7 @@ static int srp_abort(struct scsi_cmnd *scmnd) |
220 | SRP_TSK_ABORT_TASK); |
221 | srp_free_req(target, req, scmnd, 0); |
222 | scmnd->result = DID_ABORT << 16; |
223 | + scmnd->scsi_done(scmnd); |
224 | |
225 | return SUCCESS; |
226 | } |
227 | diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c |
228 | index 14eaece..0786919 100644 |
229 | --- a/drivers/input/mouse/synaptics.c |
230 | +++ b/drivers/input/mouse/synaptics.c |
231 | @@ -53,14 +53,19 @@ |
232 | #define ABS_POS_BITS 13 |
233 | |
234 | /* |
235 | - * Any position values from the hardware above the following limits are |
236 | - * treated as "wrapped around negative" values that have been truncated to |
237 | - * the 13-bit reporting range of the hardware. These are just reasonable |
238 | - * guesses and can be adjusted if hardware is found that operates outside |
239 | - * of these parameters. |
240 | + * These values should represent the absolute maximum value that will |
241 | + * be reported for a positive position value. Some Synaptics firmware |
242 | + * uses this value to indicate a finger near the edge of the touchpad |
243 | + * whose precise position cannot be determined. |
244 | + * |
245 | + * At least one touchpad is known to report positions in excess of this |
246 | + * value which are actually negative values truncated to the 13-bit |
247 | + * reporting range. These values have never been observed to be lower |
248 | + * than 8184 (i.e. -8), so we treat all values greater than 8176 as |
249 | + * negative and any other value as positive. |
250 | */ |
251 | -#define X_MAX_POSITIVE (((1 << ABS_POS_BITS) + XMAX) / 2) |
252 | -#define Y_MAX_POSITIVE (((1 << ABS_POS_BITS) + YMAX) / 2) |
253 | +#define X_MAX_POSITIVE 8176 |
254 | +#define Y_MAX_POSITIVE 8176 |
255 | |
256 | /***************************************************************************** |
257 | * Stuff we need even when we do not want native Synaptics support |
258 | @@ -604,11 +609,21 @@ static int synaptics_parse_hw_state(const unsigned char buf[], |
259 | hw->right = (buf[0] & 0x02) ? 1 : 0; |
260 | } |
261 | |
262 | - /* Convert wrap-around values to negative */ |
263 | + /* |
264 | + * Convert wrap-around values to negative. (X|Y)_MAX_POSITIVE |
265 | + * is used by some firmware to indicate a finger at the edge of |
266 | + * the touchpad whose precise position cannot be determined, so |
267 | + * convert these values to the maximum axis value. |
268 | + */ |
269 | if (hw->x > X_MAX_POSITIVE) |
270 | hw->x -= 1 << ABS_POS_BITS; |
271 | + else if (hw->x == X_MAX_POSITIVE) |
272 | + hw->x = XMAX; |
273 | + |
274 | if (hw->y > Y_MAX_POSITIVE) |
275 | hw->y -= 1 << ABS_POS_BITS; |
276 | + else if (hw->y == Y_MAX_POSITIVE) |
277 | + hw->y = YMAX; |
278 | |
279 | return 0; |
280 | } |
281 | diff --git a/drivers/mtd/ubi/attach.c b/drivers/mtd/ubi/attach.c |
282 | index bd27cbb..68d4d1f 100644 |
283 | --- a/drivers/mtd/ubi/attach.c |
284 | +++ b/drivers/mtd/ubi/attach.c |
285 | @@ -975,7 +975,7 @@ static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai, |
286 | return err; |
287 | goto adjust_mean_ec; |
288 | case UBI_IO_FF: |
289 | - if (ec_err) |
290 | + if (ec_err || bitflips) |
291 | err = add_to_list(ai, pnum, UBI_UNKNOWN, |
292 | UBI_UNKNOWN, ec, 1, &ai->erase); |
293 | else |
294 | diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c |
295 | index 2c5ed5c..da052ed 100644 |
296 | --- a/drivers/mtd/ubi/build.c |
297 | +++ b/drivers/mtd/ubi/build.c |
298 | @@ -759,6 +759,11 @@ static int autoresize(struct ubi_device *ubi, int vol_id) |
299 | struct ubi_volume *vol = ubi->volumes[vol_id]; |
300 | int err, old_reserved_pebs = vol->reserved_pebs; |
301 | |
302 | + if (ubi->ro_mode) { |
303 | + ubi_warn("skip auto-resize because of R/O mode"); |
304 | + return 0; |
305 | + } |
306 | + |
307 | /* |
308 | * Clear the auto-resize flag in the volume in-memory copy of the |
309 | * volume table, and 'ubi_resize_volume()' will propagate this change |
310 | diff --git a/drivers/net/can/mscan/mpc5xxx_can.c b/drivers/net/can/mscan/mpc5xxx_can.c |
311 | index 06adf88..524ef96 100644 |
312 | --- a/drivers/net/can/mscan/mpc5xxx_can.c |
313 | +++ b/drivers/net/can/mscan/mpc5xxx_can.c |
314 | @@ -181,7 +181,7 @@ static u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev, |
315 | |
316 | if (!clock_name || !strcmp(clock_name, "sys")) { |
317 | sys_clk = clk_get(&ofdev->dev, "sys_clk"); |
318 | - if (!sys_clk) { |
319 | + if (IS_ERR(sys_clk)) { |
320 | dev_err(&ofdev->dev, "couldn't get sys_clk\n"); |
321 | goto exit_unmap; |
322 | } |
323 | @@ -204,7 +204,7 @@ static u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev, |
324 | |
325 | if (clocksrc < 0) { |
326 | ref_clk = clk_get(&ofdev->dev, "ref_clk"); |
327 | - if (!ref_clk) { |
328 | + if (IS_ERR(ref_clk)) { |
329 | dev_err(&ofdev->dev, "couldn't get ref_clk\n"); |
330 | goto exit_unmap; |
331 | } |
332 | diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c |
333 | index a978984..0c43e7f 100644 |
334 | --- a/drivers/net/wireless/ath/ath9k/pci.c |
335 | +++ b/drivers/net/wireless/ath/ath9k/pci.c |
336 | @@ -127,8 +127,9 @@ static void ath_pci_aspm_init(struct ath_common *common) |
337 | if (!parent) |
338 | return; |
339 | |
340 | - if (ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) { |
341 | - /* Bluetooth coexistance requires disabling ASPM. */ |
342 | + if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) && |
343 | + (AR_SREV_9285(ah))) { |
344 | + /* Bluetooth coexistance requires disabling ASPM for AR9285. */ |
345 | pci_read_config_byte(pdev, pos + PCI_EXP_LNKCTL, &aspm); |
346 | aspm &= ~(PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1); |
347 | pci_write_config_byte(pdev, pos + PCI_EXP_LNKCTL, aspm); |
348 | diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c |
349 | index 8156135..0ef08e0 100644 |
350 | --- a/drivers/net/wireless/b43legacy/main.c |
351 | +++ b/drivers/net/wireless/b43legacy/main.c |
352 | @@ -3894,6 +3894,8 @@ static void b43legacy_remove(struct ssb_device *dev) |
353 | cancel_work_sync(&wl->firmware_load); |
354 | |
355 | B43legacy_WARN_ON(!wl); |
356 | + if (!wldev->fw.ucode) |
357 | + return; /* NULL if fw never loaded */ |
358 | if (wl->current_dev == wldev) |
359 | ieee80211_unregister_hw(wl->hw); |
360 | |
361 | diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig |
362 | index f8d818a..811ff72 100644 |
363 | --- a/drivers/remoteproc/Kconfig |
364 | +++ b/drivers/remoteproc/Kconfig |
365 | @@ -5,6 +5,7 @@ config REMOTEPROC |
366 | tristate |
367 | depends on EXPERIMENTAL |
368 | select FW_CONFIG |
369 | + select VIRTIO |
370 | |
371 | config OMAP_REMOTEPROC |
372 | tristate "OMAP remoteproc support" |
373 | diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c |
374 | index d5c2dbf..70b296f 100644 |
375 | --- a/drivers/remoteproc/remoteproc_core.c |
376 | +++ b/drivers/remoteproc/remoteproc_core.c |
377 | @@ -545,17 +545,10 @@ static int rproc_handle_carveout(struct rproc *rproc, |
378 | dev_dbg(dev, "carveout rsc: da %x, pa %x, len %x, flags %x\n", |
379 | rsc->da, rsc->pa, rsc->len, rsc->flags); |
380 | |
381 | - mapping = kzalloc(sizeof(*mapping), GFP_KERNEL); |
382 | - if (!mapping) { |
383 | - dev_err(dev, "kzalloc mapping failed\n"); |
384 | - return -ENOMEM; |
385 | - } |
386 | - |
387 | carveout = kzalloc(sizeof(*carveout), GFP_KERNEL); |
388 | if (!carveout) { |
389 | dev_err(dev, "kzalloc carveout failed\n"); |
390 | - ret = -ENOMEM; |
391 | - goto free_mapping; |
392 | + return -ENOMEM; |
393 | } |
394 | |
395 | va = dma_alloc_coherent(dev->parent, rsc->len, &dma, GFP_KERNEL); |
396 | @@ -585,11 +578,18 @@ static int rproc_handle_carveout(struct rproc *rproc, |
397 | * physical address in this case. |
398 | */ |
399 | if (rproc->domain) { |
400 | + mapping = kzalloc(sizeof(*mapping), GFP_KERNEL); |
401 | + if (!mapping) { |
402 | + dev_err(dev, "kzalloc mapping failed\n"); |
403 | + ret = -ENOMEM; |
404 | + goto dma_free; |
405 | + } |
406 | + |
407 | ret = iommu_map(rproc->domain, rsc->da, dma, rsc->len, |
408 | rsc->flags); |
409 | if (ret) { |
410 | dev_err(dev, "iommu_map failed: %d\n", ret); |
411 | - goto dma_free; |
412 | + goto free_mapping; |
413 | } |
414 | |
415 | /* |
416 | @@ -634,12 +634,12 @@ static int rproc_handle_carveout(struct rproc *rproc, |
417 | |
418 | return 0; |
419 | |
420 | +free_mapping: |
421 | + kfree(mapping); |
422 | dma_free: |
423 | dma_free_coherent(dev->parent, rsc->len, va, dma); |
424 | free_carv: |
425 | kfree(carveout); |
426 | -free_mapping: |
427 | - kfree(mapping); |
428 | return ret; |
429 | } |
430 | |
431 | diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c |
432 | index 08d80a6..6f4d8e6 100644 |
433 | --- a/drivers/scsi/device_handler/scsi_dh_alua.c |
434 | +++ b/drivers/scsi/device_handler/scsi_dh_alua.c |
435 | @@ -641,8 +641,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h) |
436 | h->state = TPGS_STATE_STANDBY; |
437 | break; |
438 | case TPGS_STATE_OFFLINE: |
439 | - case TPGS_STATE_UNAVAILABLE: |
440 | - /* Path unusable for unavailable/offline */ |
441 | + /* Path unusable */ |
442 | err = SCSI_DH_DEV_OFFLINED; |
443 | break; |
444 | default: |
445 | diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c |
446 | index 2b4261c..f9823f2 100644 |
447 | --- a/drivers/scsi/hpsa.c |
448 | +++ b/drivers/scsi/hpsa.c |
449 | @@ -3266,7 +3266,7 @@ static void fill_cmd(struct CommandList *c, u8 cmd, struct ctlr_info *h, |
450 | c->Request.Timeout = 0; /* Don't time out */ |
451 | memset(&c->Request.CDB[0], 0, sizeof(c->Request.CDB)); |
452 | c->Request.CDB[0] = cmd; |
453 | - c->Request.CDB[1] = 0x03; /* Reset target above */ |
454 | + c->Request.CDB[1] = HPSA_RESET_TYPE_LUN; |
455 | /* If bytes 4-7 are zero, it means reset the */ |
456 | /* LunID device */ |
457 | c->Request.CDB[4] = 0x00; |
458 | diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c |
459 | index 3a6c474..337e8b3 100644 |
460 | --- a/drivers/scsi/ibmvscsi/ibmvscsi.c |
461 | +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c |
462 | @@ -1541,6 +1541,9 @@ static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata, |
463 | |
464 | host_config = &evt_struct->iu.mad.host_config; |
465 | |
466 | + /* The transport length field is only 16-bit */ |
467 | + length = min(0xffff, length); |
468 | + |
469 | /* Set up a lun reset SRP command */ |
470 | memset(host_config, 0x00, sizeof(*host_config)); |
471 | host_config->common.type = VIOSRP_HOST_CONFIG_TYPE; |
472 | diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c |
473 | index 92c1d86..1286a8a 100644 |
474 | --- a/drivers/scsi/isci/init.c |
475 | +++ b/drivers/scsi/isci/init.c |
476 | @@ -644,7 +644,6 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic |
477 | orom->hdr.version)) { |
478 | dev_warn(&pdev->dev, |
479 | "[%d]: invalid oem parameters detected, falling back to firmware\n", i); |
480 | - devm_kfree(&pdev->dev, orom); |
481 | orom = NULL; |
482 | break; |
483 | } |
484 | diff --git a/drivers/scsi/isci/probe_roms.c b/drivers/scsi/isci/probe_roms.c |
485 | index 4d95654..8ac646e 100644 |
486 | --- a/drivers/scsi/isci/probe_roms.c |
487 | +++ b/drivers/scsi/isci/probe_roms.c |
488 | @@ -104,7 +104,6 @@ struct isci_orom *isci_request_oprom(struct pci_dev *pdev) |
489 | |
490 | if (i >= len) { |
491 | dev_err(&pdev->dev, "oprom parse error\n"); |
492 | - devm_kfree(&pdev->dev, rom); |
493 | rom = NULL; |
494 | } |
495 | pci_unmap_biosrom(oprom); |
496 | diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c |
497 | index 093d4f6..ce5224c 100644 |
498 | --- a/drivers/scsi/scsi_sysfs.c |
499 | +++ b/drivers/scsi/scsi_sysfs.c |
500 | @@ -1031,33 +1031,31 @@ static void __scsi_remove_target(struct scsi_target *starget) |
501 | void scsi_remove_target(struct device *dev) |
502 | { |
503 | struct Scsi_Host *shost = dev_to_shost(dev->parent); |
504 | - struct scsi_target *starget, *found; |
505 | + struct scsi_target *starget, *last = NULL; |
506 | unsigned long flags; |
507 | |
508 | - restart: |
509 | - found = NULL; |
510 | + /* remove targets being careful to lookup next entry before |
511 | + * deleting the last |
512 | + */ |
513 | spin_lock_irqsave(shost->host_lock, flags); |
514 | list_for_each_entry(starget, &shost->__targets, siblings) { |
515 | if (starget->state == STARGET_DEL) |
516 | continue; |
517 | if (starget->dev.parent == dev || &starget->dev == dev) { |
518 | - found = starget; |
519 | - found->reap_ref++; |
520 | - break; |
521 | + /* assuming new targets arrive at the end */ |
522 | + starget->reap_ref++; |
523 | + spin_unlock_irqrestore(shost->host_lock, flags); |
524 | + if (last) |
525 | + scsi_target_reap(last); |
526 | + last = starget; |
527 | + __scsi_remove_target(starget); |
528 | + spin_lock_irqsave(shost->host_lock, flags); |
529 | } |
530 | } |
531 | spin_unlock_irqrestore(shost->host_lock, flags); |
532 | |
533 | - if (found) { |
534 | - __scsi_remove_target(found); |
535 | - scsi_target_reap(found); |
536 | - /* in the case where @dev has multiple starget children, |
537 | - * continue removing. |
538 | - * |
539 | - * FIXME: does such a case exist? |
540 | - */ |
541 | - goto restart; |
542 | - } |
543 | + if (last) |
544 | + scsi_target_reap(last); |
545 | } |
546 | EXPORT_SYMBOL(scsi_remove_target); |
547 | |
548 | diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c |
549 | index e821264..41dea18 100644 |
550 | --- a/drivers/staging/comedi/comedi_fops.c |
551 | +++ b/drivers/staging/comedi/comedi_fops.c |
552 | @@ -951,7 +951,7 @@ static int parse_insn(struct comedi_device *dev, struct comedi_insn *insn, |
553 | ret = -EAGAIN; |
554 | break; |
555 | } |
556 | - ret = s->async->inttrig(dev, s, insn->data[0]); |
557 | + ret = s->async->inttrig(dev, s, data[0]); |
558 | if (ret >= 0) |
559 | ret = 1; |
560 | break; |
561 | @@ -1196,7 +1196,6 @@ static int do_cmd_ioctl(struct comedi_device *dev, |
562 | goto cleanup; |
563 | } |
564 | |
565 | - kfree(async->cmd.chanlist); |
566 | async->cmd = user_cmd; |
567 | async->cmd.data = NULL; |
568 | /* load channel/gain list */ |
569 | @@ -2033,6 +2032,8 @@ void do_become_nonbusy(struct comedi_device *dev, struct comedi_subdevice *s) |
570 | if (async) { |
571 | comedi_reset_async_buf(async); |
572 | async->inttrig = NULL; |
573 | + kfree(async->cmd.chanlist); |
574 | + async->cmd.chanlist = NULL; |
575 | } else { |
576 | printk(KERN_ERR |
577 | "BUG: (?) do_become_nonbusy called with async=0\n"); |
578 | diff --git a/drivers/staging/comedi/drivers/jr3_pci.c b/drivers/staging/comedi/drivers/jr3_pci.c |
579 | index 93f94cd..9c133a0 100644 |
580 | --- a/drivers/staging/comedi/drivers/jr3_pci.c |
581 | +++ b/drivers/staging/comedi/drivers/jr3_pci.c |
582 | @@ -884,7 +884,7 @@ static int jr3_pci_attach(struct comedi_device *dev, |
583 | } |
584 | |
585 | /* Reset DSP card */ |
586 | - devpriv->iobase->channel[0].reset = 0; |
587 | + writel(0, &devpriv->iobase->channel[0].reset); |
588 | |
589 | result = comedi_load_firmware(dev, "jr3pci.idm", jr3_download_firmware); |
590 | dev_dbg(dev->class_dev, "Firmare load %d\n", result); |
591 | diff --git a/drivers/staging/comedi/drivers/s626.c b/drivers/staging/comedi/drivers/s626.c |
592 | index f90578e..2b03b68 100644 |
593 | --- a/drivers/staging/comedi/drivers/s626.c |
594 | +++ b/drivers/staging/comedi/drivers/s626.c |
595 | @@ -1868,7 +1868,7 @@ static int s626_enc_insn_config(struct comedi_device *dev, |
596 | /* (data==NULL) ? (Preloadvalue=0) : (Preloadvalue=data[0]); */ |
597 | |
598 | k->SetMode(dev, k, Setup, TRUE); |
599 | - Preload(dev, k, *(insn->data)); |
600 | + Preload(dev, k, data[0]); |
601 | k->PulseIndex(dev, k); |
602 | SetLatchSource(dev, k, valueSrclatch); |
603 | k->SetEnable(dev, k, (uint16_t) (enab != 0)); |
604 | diff --git a/drivers/staging/rtl8712/rtl8712_recv.c b/drivers/staging/rtl8712/rtl8712_recv.c |
605 | index 8e82ce2..88e3ca6 100644 |
606 | --- a/drivers/staging/rtl8712/rtl8712_recv.c |
607 | +++ b/drivers/staging/rtl8712/rtl8712_recv.c |
608 | @@ -1127,6 +1127,9 @@ static void recv_tasklet(void *priv) |
609 | recvbuf2recvframe(padapter, pskb); |
610 | skb_reset_tail_pointer(pskb); |
611 | pskb->len = 0; |
612 | - skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); |
613 | + if (!skb_cloned(pskb)) |
614 | + skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); |
615 | + else |
616 | + consume_skb(pskb); |
617 | } |
618 | } |
619 | diff --git a/drivers/staging/speakup/speakup_soft.c b/drivers/staging/speakup/speakup_soft.c |
620 | index 42cdafe..b5130c8 100644 |
621 | --- a/drivers/staging/speakup/speakup_soft.c |
622 | +++ b/drivers/staging/speakup/speakup_soft.c |
623 | @@ -40,7 +40,7 @@ static int softsynth_is_alive(struct spk_synth *synth); |
624 | static unsigned char get_index(void); |
625 | |
626 | static struct miscdevice synth_device; |
627 | -static int initialized; |
628 | +static int init_pos; |
629 | static int misc_registered; |
630 | |
631 | static struct var_t vars[] = { |
632 | @@ -194,7 +194,7 @@ static int softsynth_close(struct inode *inode, struct file *fp) |
633 | unsigned long flags; |
634 | spk_lock(flags); |
635 | synth_soft.alive = 0; |
636 | - initialized = 0; |
637 | + init_pos = 0; |
638 | spk_unlock(flags); |
639 | /* Make sure we let applications go before leaving */ |
640 | speakup_start_ttys(); |
641 | @@ -239,13 +239,8 @@ static ssize_t softsynth_read(struct file *fp, char *buf, size_t count, |
642 | ch = '\x18'; |
643 | } else if (synth_buffer_empty()) { |
644 | break; |
645 | - } else if (!initialized) { |
646 | - if (*init) { |
647 | - ch = *init; |
648 | - init++; |
649 | - } else { |
650 | - initialized = 1; |
651 | - } |
652 | + } else if (init[init_pos]) { |
653 | + ch = init[init_pos++]; |
654 | } else { |
655 | ch = synth_buffer_getc(); |
656 | } |
657 | diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c |
658 | index c43b683..90dff82 100644 |
659 | --- a/drivers/tty/n_gsm.c |
660 | +++ b/drivers/tty/n_gsm.c |
661 | @@ -875,7 +875,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm, |
662 | |
663 | /* dlci->skb is locked by tx_lock */ |
664 | if (dlci->skb == NULL) { |
665 | - dlci->skb = skb_dequeue(&dlci->skb_list); |
666 | + dlci->skb = skb_dequeue_tail(&dlci->skb_list); |
667 | if (dlci->skb == NULL) |
668 | return 0; |
669 | first = 1; |
670 | @@ -899,8 +899,11 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm, |
671 | |
672 | /* FIXME: need a timer or something to kick this so it can't |
673 | get stuck with no work outstanding and no buffer free */ |
674 | - if (msg == NULL) |
675 | + if (msg == NULL) { |
676 | + skb_queue_tail(&dlci->skb_list, dlci->skb); |
677 | + dlci->skb = NULL; |
678 | return -ENOMEM; |
679 | + } |
680 | dp = msg->data; |
681 | |
682 | if (dlci->adaption == 4) { /* Interruptible framed (Packetised Data) */ |
683 | @@ -971,16 +974,19 @@ static void gsm_dlci_data_sweep(struct gsm_mux *gsm) |
684 | static void gsm_dlci_data_kick(struct gsm_dlci *dlci) |
685 | { |
686 | unsigned long flags; |
687 | + int sweep; |
688 | |
689 | spin_lock_irqsave(&dlci->gsm->tx_lock, flags); |
690 | /* If we have nothing running then we need to fire up */ |
691 | + sweep = (dlci->gsm->tx_bytes < TX_THRESH_LO); |
692 | if (dlci->gsm->tx_bytes == 0) { |
693 | if (dlci->net) |
694 | gsm_dlci_data_output_framed(dlci->gsm, dlci); |
695 | else |
696 | gsm_dlci_data_output(dlci->gsm, dlci); |
697 | - } else if (dlci->gsm->tx_bytes < TX_THRESH_LO) |
698 | - gsm_dlci_data_sweep(dlci->gsm); |
699 | + } |
700 | + if (sweep) |
701 | + gsm_dlci_data_sweep(dlci->gsm); |
702 | spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags); |
703 | } |
704 | |
705 | @@ -1190,6 +1196,8 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command, |
706 | u8 *data, int clen) |
707 | { |
708 | u8 buf[1]; |
709 | + unsigned long flags; |
710 | + |
711 | switch (command) { |
712 | case CMD_CLD: { |
713 | struct gsm_dlci *dlci = gsm->dlci[0]; |
714 | @@ -1215,7 +1223,9 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command, |
715 | gsm->constipated = 0; |
716 | gsm_control_reply(gsm, CMD_FCOFF, NULL, 0); |
717 | /* Kick the link in case it is idling */ |
718 | + spin_lock_irqsave(&gsm->tx_lock, flags); |
719 | gsm_data_kick(gsm); |
720 | + spin_unlock_irqrestore(&gsm->tx_lock, flags); |
721 | break; |
722 | case CMD_MSC: |
723 | /* Out of band modem line change indicator for a DLCI */ |
724 | @@ -2377,12 +2387,12 @@ static void gsmld_write_wakeup(struct tty_struct *tty) |
725 | |
726 | /* Queue poll */ |
727 | clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); |
728 | + spin_lock_irqsave(&gsm->tx_lock, flags); |
729 | gsm_data_kick(gsm); |
730 | if (gsm->tx_bytes < TX_THRESH_LO) { |
731 | - spin_lock_irqsave(&gsm->tx_lock, flags); |
732 | gsm_dlci_data_sweep(gsm); |
733 | - spin_unlock_irqrestore(&gsm->tx_lock, flags); |
734 | } |
735 | + spin_unlock_irqrestore(&gsm->tx_lock, flags); |
736 | } |
737 | |
738 | /** |
739 | @@ -2889,6 +2899,10 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp) |
740 | gsm = gsm_mux[mux]; |
741 | if (gsm->dead) |
742 | return -EL2HLT; |
743 | + /* If DLCI 0 is not yet fully open return an error. This is ok from a locking |
744 | + perspective as we don't have to worry about this if DLCI0 is lost */ |
745 | + if (gsm->dlci[0] && gsm->dlci[0]->state != DLCI_OPEN) |
746 | + return -EL2NSYNC; |
747 | dlci = gsm->dlci[line]; |
748 | if (dlci == NULL) |
749 | dlci = gsm_dlci_alloc(gsm, line); |
750 | diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c |
751 | index ee1c268..26f0d0e 100644 |
752 | --- a/drivers/tty/n_tty.c |
753 | +++ b/drivers/tty/n_tty.c |
754 | @@ -1728,7 +1728,8 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, |
755 | |
756 | do_it_again: |
757 | |
758 | - BUG_ON(!tty->read_buf); |
759 | + if (WARN_ON(!tty->read_buf)) |
760 | + return -EAGAIN; |
761 | |
762 | c = job_control(tty, file); |
763 | if (c < 0) |
764 | diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c |
765 | index 28e7c7c..6b8fcb4 100644 |
766 | --- a/drivers/tty/serial/8250/8250_pci.c |
767 | +++ b/drivers/tty/serial/8250/8250_pci.c |
768 | @@ -1164,6 +1164,8 @@ pci_xr17c154_setup(struct serial_private *priv, |
769 | #define PCI_SUBDEVICE_ID_OCTPRO422 0x0208 |
770 | #define PCI_SUBDEVICE_ID_POCTAL232 0x0308 |
771 | #define PCI_SUBDEVICE_ID_POCTAL422 0x0408 |
772 | +#define PCI_SUBDEVICE_ID_SIIG_DUAL_00 0x2500 |
773 | +#define PCI_SUBDEVICE_ID_SIIG_DUAL_30 0x2530 |
774 | #define PCI_VENDOR_ID_ADVANTECH 0x13fe |
775 | #define PCI_DEVICE_ID_INTEL_CE4100_UART 0x2e66 |
776 | #define PCI_DEVICE_ID_ADVANTECH_PCI3620 0x3620 |
777 | @@ -3232,8 +3234,11 @@ static struct pci_device_id serial_pci_tbl[] = { |
778 | * For now just used the hex ID 0x950a. |
779 | */ |
780 | { PCI_VENDOR_ID_OXSEMI, 0x950a, |
781 | - PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL, 0, 0, |
782 | - pbn_b0_2_115200 }, |
783 | + PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_00, |
784 | + 0, 0, pbn_b0_2_115200 }, |
785 | + { PCI_VENDOR_ID_OXSEMI, 0x950a, |
786 | + PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_30, |
787 | + 0, 0, pbn_b0_2_115200 }, |
788 | { PCI_VENDOR_ID_OXSEMI, 0x950a, |
789 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
790 | pbn_b0_2_1130000 }, |
791 | diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c |
792 | index d3553b5..762f5fd 100644 |
793 | --- a/drivers/tty/serial/amba-pl011.c |
794 | +++ b/drivers/tty/serial/amba-pl011.c |
795 | @@ -1603,13 +1603,26 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios, |
796 | old_cr &= ~ST_UART011_CR_OVSFACT; |
797 | } |
798 | |
799 | + /* |
800 | + * Workaround for the ST Micro oversampling variants to |
801 | + * increase the bitrate slightly, by lowering the divisor, |
802 | + * to avoid delayed sampling of start bit at high speeds, |
803 | + * else we see data corruption. |
804 | + */ |
805 | + if (uap->vendor->oversampling) { |
806 | + if ((baud >= 3000000) && (baud < 3250000) && (quot > 1)) |
807 | + quot -= 1; |
808 | + else if ((baud > 3250000) && (quot > 2)) |
809 | + quot -= 2; |
810 | + } |
811 | /* Set baud rate */ |
812 | writew(quot & 0x3f, port->membase + UART011_FBRD); |
813 | writew(quot >> 6, port->membase + UART011_IBRD); |
814 | |
815 | /* |
816 | * ----------v----------v----------v----------v----- |
817 | - * NOTE: MUST BE WRITTEN AFTER UARTLCR_M & UARTLCR_L |
818 | + * NOTE: lcrh_tx and lcrh_rx MUST BE WRITTEN AFTER |
819 | + * UART011_FBRD & UART011_IBRD. |
820 | * ----------^----------^----------^----------^----- |
821 | */ |
822 | writew(lcr_h, port->membase + uap->lcrh_rx); |
823 | diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c |
824 | index d3cda0c..22992cd 100644 |
825 | --- a/drivers/tty/serial/omap-serial.c |
826 | +++ b/drivers/tty/serial/omap-serial.c |
827 | @@ -667,19 +667,19 @@ serial_omap_configure_xonxoff |
828 | |
829 | /* |
830 | * IXON Flag: |
831 | - * Enable XON/XOFF flow control on output. |
832 | - * Transmit XON1, XOFF1 |
833 | + * Flow control for OMAP.TX |
834 | + * OMAP.RX should listen for XON/XOFF |
835 | */ |
836 | if (termios->c_iflag & IXON) |
837 | - up->efr |= OMAP_UART_SW_TX; |
838 | + up->efr |= OMAP_UART_SW_RX; |
839 | |
840 | /* |
841 | * IXOFF Flag: |
842 | - * Enable XON/XOFF flow control on input. |
843 | - * Receiver compares XON1, XOFF1. |
844 | + * Flow control for OMAP.RX |
845 | + * OMAP.TX should send XON/XOFF |
846 | */ |
847 | if (termios->c_iflag & IXOFF) |
848 | - up->efr |= OMAP_UART_SW_RX; |
849 | + up->efr |= OMAP_UART_SW_TX; |
850 | |
851 | serial_out(up, UART_EFR, up->efr | UART_EFR_ECB); |
852 | serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A); |
853 | diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c |
854 | index 48cc6f2..770a854 100644 |
855 | --- a/drivers/tty/vt/keyboard.c |
856 | +++ b/drivers/tty/vt/keyboard.c |
857 | @@ -1049,13 +1049,10 @@ static int kbd_update_leds_helper(struct input_handle *handle, void *data) |
858 | */ |
859 | int vt_get_leds(int console, int flag) |
860 | { |
861 | - unsigned long flags; |
862 | struct kbd_struct * kbd = kbd_table + console; |
863 | int ret; |
864 | |
865 | - spin_lock_irqsave(&kbd_event_lock, flags); |
866 | ret = vc_kbd_led(kbd, flag); |
867 | - spin_unlock_irqrestore(&kbd_event_lock, flags); |
868 | |
869 | return ret; |
870 | } |
871 | diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c |
872 | index f1f9290..7587615 100644 |
873 | --- a/drivers/usb/gadget/printer.c |
874 | +++ b/drivers/usb/gadget/printer.c |
875 | @@ -141,18 +141,14 @@ module_param(qlen, uint, S_IRUGO|S_IWUSR); |
876 | * descriptors are built on demand. |
877 | */ |
878 | |
879 | -#define STRING_MANUFACTURER 1 |
880 | -#define STRING_PRODUCT 2 |
881 | -#define STRING_SERIALNUM 3 |
882 | +#define STRING_MANUFACTURER 0 |
883 | +#define STRING_PRODUCT 1 |
884 | +#define STRING_SERIALNUM 2 |
885 | |
886 | /* holds our biggest descriptor */ |
887 | #define USB_DESC_BUFSIZE 256 |
888 | #define USB_BUFSIZE 8192 |
889 | |
890 | -/* This device advertises one configuration. */ |
891 | -#define DEV_CONFIG_VALUE 1 |
892 | -#define PRINTER_INTERFACE 0 |
893 | - |
894 | static struct usb_device_descriptor device_desc = { |
895 | .bLength = sizeof device_desc, |
896 | .bDescriptorType = USB_DT_DEVICE, |
897 | @@ -162,16 +158,12 @@ static struct usb_device_descriptor device_desc = { |
898 | .bDeviceProtocol = 0, |
899 | .idVendor = cpu_to_le16(PRINTER_VENDOR_NUM), |
900 | .idProduct = cpu_to_le16(PRINTER_PRODUCT_NUM), |
901 | - .iManufacturer = STRING_MANUFACTURER, |
902 | - .iProduct = STRING_PRODUCT, |
903 | - .iSerialNumber = STRING_SERIALNUM, |
904 | .bNumConfigurations = 1 |
905 | }; |
906 | |
907 | static struct usb_interface_descriptor intf_desc = { |
908 | .bLength = sizeof intf_desc, |
909 | .bDescriptorType = USB_DT_INTERFACE, |
910 | - .bInterfaceNumber = PRINTER_INTERFACE, |
911 | .bNumEndpoints = 2, |
912 | .bInterfaceClass = USB_CLASS_PRINTER, |
913 | .bInterfaceSubClass = 1, /* Printer Sub-Class */ |
914 | @@ -260,9 +252,9 @@ static char pnp_string [1024] = |
915 | |
916 | /* static strings, in UTF-8 */ |
917 | static struct usb_string strings [] = { |
918 | - { STRING_MANUFACTURER, manufacturer, }, |
919 | - { STRING_PRODUCT, product_desc, }, |
920 | - { STRING_SERIALNUM, serial_num, }, |
921 | + [STRING_MANUFACTURER].s = manufacturer, |
922 | + [STRING_PRODUCT].s = product_desc, |
923 | + [STRING_SERIALNUM].s = serial_num, |
924 | { } /* end of list */ |
925 | }; |
926 | |
927 | @@ -871,25 +863,13 @@ static int set_interface(struct printer_dev *dev, unsigned number) |
928 | int result = 0; |
929 | |
930 | /* Free the current interface */ |
931 | - switch (dev->interface) { |
932 | - case PRINTER_INTERFACE: |
933 | - printer_reset_interface(dev); |
934 | - break; |
935 | - } |
936 | + printer_reset_interface(dev); |
937 | |
938 | - switch (number) { |
939 | - case PRINTER_INTERFACE: |
940 | - result = set_printer_interface(dev); |
941 | - if (result) { |
942 | - printer_reset_interface(dev); |
943 | - } else { |
944 | - dev->interface = PRINTER_INTERFACE; |
945 | - } |
946 | - break; |
947 | - default: |
948 | - result = -EINVAL; |
949 | - /* FALL THROUGH */ |
950 | - } |
951 | + result = set_printer_interface(dev); |
952 | + if (result) |
953 | + printer_reset_interface(dev); |
954 | + else |
955 | + dev->interface = number; |
956 | |
957 | if (!result) |
958 | INFO(dev, "Using interface %x\n", number); |
959 | @@ -972,7 +952,7 @@ static int printer_func_setup(struct usb_function *f, |
960 | switch (ctrl->bRequest) { |
961 | case 0: /* Get the IEEE-1284 PNP String */ |
962 | /* Only one printer interface is supported. */ |
963 | - if ((wIndex>>8) != PRINTER_INTERFACE) |
964 | + if ((wIndex>>8) != dev->interface) |
965 | break; |
966 | |
967 | value = (pnp_string[0]<<8)|pnp_string[1]; |
968 | @@ -983,7 +963,7 @@ static int printer_func_setup(struct usb_function *f, |
969 | |
970 | case 1: /* Get Port Status */ |
971 | /* Only one printer interface is supported. */ |
972 | - if (wIndex != PRINTER_INTERFACE) |
973 | + if (wIndex != dev->interface) |
974 | break; |
975 | |
976 | *(u8 *)req->buf = dev->printer_status; |
977 | @@ -992,7 +972,7 @@ static int printer_func_setup(struct usb_function *f, |
978 | |
979 | case 2: /* Soft Reset */ |
980 | /* Only one printer interface is supported. */ |
981 | - if (wIndex != PRINTER_INTERFACE) |
982 | + if (wIndex != dev->interface) |
983 | break; |
984 | |
985 | printer_soft_reset(dev); |
986 | @@ -1020,6 +1000,37 @@ unknown: |
987 | static int __init printer_func_bind(struct usb_configuration *c, |
988 | struct usb_function *f) |
989 | { |
990 | + struct printer_dev *dev = container_of(f, struct printer_dev, function); |
991 | + struct usb_composite_dev *cdev = c->cdev; |
992 | + struct usb_ep *in_ep, *out_ep; |
993 | + int id; |
994 | + |
995 | + id = usb_interface_id(c, f); |
996 | + if (id < 0) |
997 | + return id; |
998 | + intf_desc.bInterfaceNumber = id; |
999 | + |
1000 | + /* all we really need is bulk IN/OUT */ |
1001 | + in_ep = usb_ep_autoconfig(cdev->gadget, &fs_ep_in_desc); |
1002 | + if (!in_ep) { |
1003 | +autoconf_fail: |
1004 | + dev_err(&cdev->gadget->dev, "can't autoconfigure on %s\n", |
1005 | + cdev->gadget->name); |
1006 | + return -ENODEV; |
1007 | + } |
1008 | + in_ep->driver_data = in_ep; /* claim */ |
1009 | + |
1010 | + out_ep = usb_ep_autoconfig(cdev->gadget, &fs_ep_out_desc); |
1011 | + if (!out_ep) |
1012 | + goto autoconf_fail; |
1013 | + out_ep->driver_data = out_ep; /* claim */ |
1014 | + |
1015 | + /* assumes that all endpoints are dual-speed */ |
1016 | + hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; |
1017 | + hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; |
1018 | + |
1019 | + dev->in_ep = in_ep; |
1020 | + dev->out_ep = out_ep; |
1021 | return 0; |
1022 | } |
1023 | |
1024 | @@ -1035,7 +1046,8 @@ static int printer_func_set_alt(struct usb_function *f, |
1025 | int ret = -ENOTSUPP; |
1026 | |
1027 | if (!alt) |
1028 | - ret = set_interface(dev, PRINTER_INTERFACE); |
1029 | + ret = set_interface(dev, intf); |
1030 | + |
1031 | return ret; |
1032 | } |
1033 | |
1034 | @@ -1107,13 +1119,14 @@ static int __init printer_bind_config(struct usb_configuration *c) |
1035 | { |
1036 | struct usb_gadget *gadget = c->cdev->gadget; |
1037 | struct printer_dev *dev; |
1038 | - struct usb_ep *in_ep, *out_ep; |
1039 | int status = -ENOMEM; |
1040 | int gcnum; |
1041 | size_t len; |
1042 | u32 i; |
1043 | struct usb_request *req; |
1044 | |
1045 | + usb_ep_autoconfig_reset(gadget); |
1046 | + |
1047 | dev = &usb_printer_gadget; |
1048 | |
1049 | dev->function.name = shortname; |
1050 | @@ -1125,6 +1138,10 @@ static int __init printer_bind_config(struct usb_configuration *c) |
1051 | dev->function.set_alt = printer_func_set_alt; |
1052 | dev->function.disable = printer_func_disable; |
1053 | |
1054 | + status = usb_add_function(c, &dev->function); |
1055 | + if (status) |
1056 | + return status; |
1057 | + |
1058 | /* Setup the sysfs files for the printer gadget. */ |
1059 | dev->pdev = device_create(usb_gadget_class, NULL, g_printer_devno, |
1060 | NULL, "g_printer"); |
1061 | @@ -1169,26 +1186,6 @@ static int __init printer_bind_config(struct usb_configuration *c) |
1062 | pnp_string[0] = (len >> 8) & 0xFF; |
1063 | pnp_string[1] = len & 0xFF; |
1064 | |
1065 | - /* all we really need is bulk IN/OUT */ |
1066 | - usb_ep_autoconfig_reset(gadget); |
1067 | - in_ep = usb_ep_autoconfig(gadget, &fs_ep_in_desc); |
1068 | - if (!in_ep) { |
1069 | -autoconf_fail: |
1070 | - dev_err(&gadget->dev, "can't autoconfigure on %s\n", |
1071 | - gadget->name); |
1072 | - return -ENODEV; |
1073 | - } |
1074 | - in_ep->driver_data = in_ep; /* claim */ |
1075 | - |
1076 | - out_ep = usb_ep_autoconfig(gadget, &fs_ep_out_desc); |
1077 | - if (!out_ep) |
1078 | - goto autoconf_fail; |
1079 | - out_ep->driver_data = out_ep; /* claim */ |
1080 | - |
1081 | - /* assumes that all endpoints are dual-speed */ |
1082 | - hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; |
1083 | - hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; |
1084 | - |
1085 | usb_gadget_set_selfpowered(gadget); |
1086 | |
1087 | if (gadget->is_otg) { |
1088 | @@ -1215,9 +1212,6 @@ autoconf_fail: |
1089 | dev->current_rx_bytes = 0; |
1090 | dev->current_rx_buf = NULL; |
1091 | |
1092 | - dev->in_ep = in_ep; |
1093 | - dev->out_ep = out_ep; |
1094 | - |
1095 | for (i = 0; i < QLEN; i++) { |
1096 | req = printer_req_alloc(dev->in_ep, USB_BUFSIZE, GFP_KERNEL); |
1097 | if (!req) { |
1098 | @@ -1250,8 +1244,6 @@ autoconf_fail: |
1099 | dev->gadget = gadget; |
1100 | |
1101 | INFO(dev, "%s, version: " DRIVER_VERSION "\n", driver_desc); |
1102 | - INFO(dev, "using %s, OUT %s IN %s\n", gadget->name, out_ep->name, |
1103 | - in_ep->name); |
1104 | return 0; |
1105 | |
1106 | fail: |
1107 | @@ -1266,7 +1258,17 @@ static int printer_unbind(struct usb_composite_dev *cdev) |
1108 | |
1109 | static int __init printer_bind(struct usb_composite_dev *cdev) |
1110 | { |
1111 | - return usb_add_config(cdev, &printer_cfg_driver, printer_bind_config); |
1112 | + int ret; |
1113 | + |
1114 | + ret = usb_string_ids_tab(cdev, strings); |
1115 | + if (ret < 0) |
1116 | + return ret; |
1117 | + device_desc.iManufacturer = strings[STRING_MANUFACTURER].id; |
1118 | + device_desc.iProduct = strings[STRING_PRODUCT].id; |
1119 | + device_desc.iSerialNumber = strings[STRING_SERIALNUM].id; |
1120 | + |
1121 | + ret = usb_add_config(cdev, &printer_cfg_driver, printer_bind_config); |
1122 | + return ret; |
1123 | } |
1124 | |
1125 | static struct usb_composite_driver printer_driver = { |
1126 | diff --git a/drivers/usb/gadget/tcm_usb_gadget.c b/drivers/usb/gadget/tcm_usb_gadget.c |
1127 | index 5444866..d37334c 100644 |
1128 | --- a/drivers/usb/gadget/tcm_usb_gadget.c |
1129 | +++ b/drivers/usb/gadget/tcm_usb_gadget.c |
1130 | @@ -1977,7 +1977,6 @@ static struct usb_interface_descriptor bot_intf_desc = { |
1131 | .bInterfaceClass = USB_CLASS_MASS_STORAGE, |
1132 | .bInterfaceSubClass = USB_SC_SCSI, |
1133 | .bInterfaceProtocol = USB_PR_BULK, |
1134 | - .iInterface = USB_G_STR_INT_UAS, |
1135 | }; |
1136 | |
1137 | static struct usb_interface_descriptor uasp_intf_desc = { |
1138 | @@ -1988,7 +1987,6 @@ static struct usb_interface_descriptor uasp_intf_desc = { |
1139 | .bInterfaceClass = USB_CLASS_MASS_STORAGE, |
1140 | .bInterfaceSubClass = USB_SC_SCSI, |
1141 | .bInterfaceProtocol = USB_PR_UAS, |
1142 | - .iInterface = USB_G_STR_INT_BBB, |
1143 | }; |
1144 | |
1145 | static struct usb_endpoint_descriptor uasp_bi_desc = { |
1146 | @@ -2209,20 +2207,16 @@ static struct usb_device_descriptor usbg_device_desc = { |
1147 | .bDeviceClass = USB_CLASS_PER_INTERFACE, |
1148 | .idVendor = cpu_to_le16(UAS_VENDOR_ID), |
1149 | .idProduct = cpu_to_le16(UAS_PRODUCT_ID), |
1150 | - .iManufacturer = USB_G_STR_MANUFACTOR, |
1151 | - .iProduct = USB_G_STR_PRODUCT, |
1152 | - .iSerialNumber = USB_G_STR_SERIAL, |
1153 | - |
1154 | .bNumConfigurations = 1, |
1155 | }; |
1156 | |
1157 | static struct usb_string usbg_us_strings[] = { |
1158 | - { USB_G_STR_MANUFACTOR, "Target Manufactor"}, |
1159 | - { USB_G_STR_PRODUCT, "Target Product"}, |
1160 | - { USB_G_STR_SERIAL, "000000000001"}, |
1161 | - { USB_G_STR_CONFIG, "default config"}, |
1162 | - { USB_G_STR_INT_UAS, "USB Attached SCSI"}, |
1163 | - { USB_G_STR_INT_BBB, "Bulk Only Transport"}, |
1164 | + [USB_G_STR_MANUFACTOR].s = "Target Manufactor", |
1165 | + [USB_G_STR_PRODUCT].s = "Target Product", |
1166 | + [USB_G_STR_SERIAL].s = "000000000001", |
1167 | + [USB_G_STR_CONFIG].s = "default config", |
1168 | + [USB_G_STR_INT_UAS].s = "USB Attached SCSI", |
1169 | + [USB_G_STR_INT_BBB].s = "Bulk Only Transport", |
1170 | { }, |
1171 | }; |
1172 | |
1173 | @@ -2244,7 +2238,6 @@ static int guas_unbind(struct usb_composite_dev *cdev) |
1174 | static struct usb_configuration usbg_config_driver = { |
1175 | .label = "Linux Target", |
1176 | .bConfigurationValue = 1, |
1177 | - .iConfiguration = USB_G_STR_CONFIG, |
1178 | .bmAttributes = USB_CONFIG_ATT_SELFPOWER, |
1179 | }; |
1180 | |
1181 | @@ -2417,6 +2410,9 @@ static int usbg_cfg_bind(struct usb_configuration *c) |
1182 | fu->function.disable = usbg_disable; |
1183 | fu->tpg = the_only_tpg_I_currently_have; |
1184 | |
1185 | + bot_intf_desc.iInterface = usbg_us_strings[USB_G_STR_INT_BBB].id; |
1186 | + uasp_intf_desc.iInterface = usbg_us_strings[USB_G_STR_INT_UAS].id; |
1187 | + |
1188 | ret = usb_add_function(c, &fu->function); |
1189 | if (ret) |
1190 | goto err; |
1191 | @@ -2431,6 +2427,17 @@ static int usb_target_bind(struct usb_composite_dev *cdev) |
1192 | { |
1193 | int ret; |
1194 | |
1195 | + ret = usb_string_ids_tab(cdev, usbg_us_strings); |
1196 | + if (ret) |
1197 | + return ret; |
1198 | + |
1199 | + usbg_device_desc.iManufacturer = |
1200 | + usbg_us_strings[USB_G_STR_MANUFACTOR].id; |
1201 | + usbg_device_desc.iProduct = usbg_us_strings[USB_G_STR_PRODUCT].id; |
1202 | + usbg_device_desc.iSerialNumber = usbg_us_strings[USB_G_STR_SERIAL].id; |
1203 | + usbg_config_driver.iConfiguration = |
1204 | + usbg_us_strings[USB_G_STR_CONFIG].id; |
1205 | + |
1206 | ret = usb_add_config(cdev, &usbg_config_driver, |
1207 | usbg_cfg_bind); |
1208 | return 0; |
1209 | diff --git a/drivers/usb/gadget/tcm_usb_gadget.h b/drivers/usb/gadget/tcm_usb_gadget.h |
1210 | index bb18999..9d32ec3 100644 |
1211 | --- a/drivers/usb/gadget/tcm_usb_gadget.h |
1212 | +++ b/drivers/usb/gadget/tcm_usb_gadget.h |
1213 | @@ -16,12 +16,14 @@ |
1214 | #define UASP_SS_EP_COMP_LOG_STREAMS 4 |
1215 | #define UASP_SS_EP_COMP_NUM_STREAMS (1 << UASP_SS_EP_COMP_LOG_STREAMS) |
1216 | |
1217 | -#define USB_G_STR_MANUFACTOR 1 |
1218 | -#define USB_G_STR_PRODUCT 2 |
1219 | -#define USB_G_STR_SERIAL 3 |
1220 | -#define USB_G_STR_CONFIG 4 |
1221 | -#define USB_G_STR_INT_UAS 5 |
1222 | -#define USB_G_STR_INT_BBB 6 |
1223 | +enum { |
1224 | + USB_G_STR_MANUFACTOR, |
1225 | + USB_G_STR_PRODUCT, |
1226 | + USB_G_STR_SERIAL, |
1227 | + USB_G_STR_CONFIG, |
1228 | + USB_G_STR_INT_UAS, |
1229 | + USB_G_STR_INT_BBB, |
1230 | +}; |
1231 | |
1232 | #define USB_G_ALT_INT_BBB 0 |
1233 | #define USB_G_ALT_INT_UAS 1 |
1234 | diff --git a/drivers/usb/host/ehci-timer.c b/drivers/usb/host/ehci-timer.c |
1235 | index eb896a2..20dbdcb 100644 |
1236 | --- a/drivers/usb/host/ehci-timer.c |
1237 | +++ b/drivers/usb/host/ehci-timer.c |
1238 | @@ -118,7 +118,8 @@ static void ehci_poll_ASS(struct ehci_hcd *ehci) |
1239 | ehci_enable_event(ehci, EHCI_HRTIMER_POLL_ASS, true); |
1240 | return; |
1241 | } |
1242 | - ehci_warn(ehci, "Waited too long for the async schedule status, giving up\n"); |
1243 | + ehci_dbg(ehci, "Waited too long for the async schedule status (%x/%x), giving up\n", |
1244 | + want, actual); |
1245 | } |
1246 | ehci->ASS_poll_count = 0; |
1247 | |
1248 | @@ -163,7 +164,8 @@ static void ehci_poll_PSS(struct ehci_hcd *ehci) |
1249 | ehci_enable_event(ehci, EHCI_HRTIMER_POLL_PSS, true); |
1250 | return; |
1251 | } |
1252 | - ehci_warn(ehci, "Waited too long for the periodic schedule status, giving up\n"); |
1253 | + ehci_dbg(ehci, "Waited too long for the periodic schedule status (%x/%x), giving up\n", |
1254 | + want, actual); |
1255 | } |
1256 | ehci->PSS_poll_count = 0; |
1257 | |
1258 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
1259 | index 77689bd..487bc08 100644 |
1260 | --- a/drivers/usb/host/xhci-mem.c |
1261 | +++ b/drivers/usb/host/xhci-mem.c |
1262 | @@ -1772,6 +1772,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) |
1263 | { |
1264 | struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); |
1265 | struct dev_info *dev_info, *next; |
1266 | + struct xhci_cd *cur_cd, *next_cd; |
1267 | unsigned long flags; |
1268 | int size; |
1269 | int i, j, num_ports; |
1270 | @@ -1795,6 +1796,11 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) |
1271 | xhci_ring_free(xhci, xhci->cmd_ring); |
1272 | xhci->cmd_ring = NULL; |
1273 | xhci_dbg(xhci, "Freed command ring\n"); |
1274 | + list_for_each_entry_safe(cur_cd, next_cd, |
1275 | + &xhci->cancel_cmd_list, cancel_cmd_list) { |
1276 | + list_del(&cur_cd->cancel_cmd_list); |
1277 | + kfree(cur_cd); |
1278 | + } |
1279 | |
1280 | for (i = 1; i < MAX_HC_SLOTS; ++i) |
1281 | xhci_free_virt_device(xhci, i); |
1282 | @@ -2340,6 +2346,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) |
1283 | xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags); |
1284 | if (!xhci->cmd_ring) |
1285 | goto fail; |
1286 | + INIT_LIST_HEAD(&xhci->cancel_cmd_list); |
1287 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); |
1288 | xhci_dbg(xhci, "First segment DMA is 0x%llx\n", |
1289 | (unsigned long long)xhci->cmd_ring->first_seg->dma); |
1290 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
1291 | index 9bfd4ca11..8345d7c 100644 |
1292 | --- a/drivers/usb/host/xhci-pci.c |
1293 | +++ b/drivers/usb/host/xhci-pci.c |
1294 | @@ -103,6 +103,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
1295 | * PPT chipsets. |
1296 | */ |
1297 | xhci->quirks |= XHCI_SPURIOUS_REBOOT; |
1298 | + xhci->quirks |= XHCI_AVOID_BEI; |
1299 | } |
1300 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && |
1301 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { |
1302 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
1303 | index 643c2f3..a6e18b9 100644 |
1304 | --- a/drivers/usb/host/xhci-ring.c |
1305 | +++ b/drivers/usb/host/xhci-ring.c |
1306 | @@ -280,12 +280,123 @@ static inline int room_on_ring(struct xhci_hcd *xhci, struct xhci_ring *ring, |
1307 | /* Ring the host controller doorbell after placing a command on the ring */ |
1308 | void xhci_ring_cmd_db(struct xhci_hcd *xhci) |
1309 | { |
1310 | + if (!(xhci->cmd_ring_state & CMD_RING_STATE_RUNNING)) |
1311 | + return; |
1312 | + |
1313 | xhci_dbg(xhci, "// Ding dong!\n"); |
1314 | xhci_writel(xhci, DB_VALUE_HOST, &xhci->dba->doorbell[0]); |
1315 | /* Flush PCI posted writes */ |
1316 | xhci_readl(xhci, &xhci->dba->doorbell[0]); |
1317 | } |
1318 | |
1319 | +static int xhci_abort_cmd_ring(struct xhci_hcd *xhci) |
1320 | +{ |
1321 | + u64 temp_64; |
1322 | + int ret; |
1323 | + |
1324 | + xhci_dbg(xhci, "Abort command ring\n"); |
1325 | + |
1326 | + if (!(xhci->cmd_ring_state & CMD_RING_STATE_RUNNING)) { |
1327 | + xhci_dbg(xhci, "The command ring isn't running, " |
1328 | + "Have the command ring been stopped?\n"); |
1329 | + return 0; |
1330 | + } |
1331 | + |
1332 | + temp_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring); |
1333 | + if (!(temp_64 & CMD_RING_RUNNING)) { |
1334 | + xhci_dbg(xhci, "Command ring had been stopped\n"); |
1335 | + return 0; |
1336 | + } |
1337 | + xhci->cmd_ring_state = CMD_RING_STATE_ABORTED; |
1338 | + xhci_write_64(xhci, temp_64 | CMD_RING_ABORT, |
1339 | + &xhci->op_regs->cmd_ring); |
1340 | + |
1341 | + /* Section 4.6.1.2 of xHCI 1.0 spec says software should |
1342 | + * time the completion od all xHCI commands, including |
1343 | + * the Command Abort operation. If software doesn't see |
1344 | + * CRR negated in a timely manner (e.g. longer than 5 |
1345 | + * seconds), then it should assume that the there are |
1346 | + * larger problems with the xHC and assert HCRST. |
1347 | + */ |
1348 | + ret = handshake(xhci, &xhci->op_regs->cmd_ring, |
1349 | + CMD_RING_RUNNING, 0, 5 * 1000 * 1000); |
1350 | + if (ret < 0) { |
1351 | + xhci_err(xhci, "Stopped the command ring failed, " |
1352 | + "maybe the host is dead\n"); |
1353 | + xhci->xhc_state |= XHCI_STATE_DYING; |
1354 | + xhci_quiesce(xhci); |
1355 | + xhci_halt(xhci); |
1356 | + return -ESHUTDOWN; |
1357 | + } |
1358 | + |
1359 | + return 0; |
1360 | +} |
1361 | + |
1362 | +static int xhci_queue_cd(struct xhci_hcd *xhci, |
1363 | + struct xhci_command *command, |
1364 | + union xhci_trb *cmd_trb) |
1365 | +{ |
1366 | + struct xhci_cd *cd; |
1367 | + cd = kzalloc(sizeof(struct xhci_cd), GFP_ATOMIC); |
1368 | + if (!cd) |
1369 | + return -ENOMEM; |
1370 | + INIT_LIST_HEAD(&cd->cancel_cmd_list); |
1371 | + |
1372 | + cd->command = command; |
1373 | + cd->cmd_trb = cmd_trb; |
1374 | + list_add_tail(&cd->cancel_cmd_list, &xhci->cancel_cmd_list); |
1375 | + |
1376 | + return 0; |
1377 | +} |
1378 | + |
1379 | +/* |
1380 | + * Cancel the command which has issue. |
1381 | + * |
1382 | + * Some commands may hang due to waiting for acknowledgement from |
1383 | + * usb device. It is outside of the xHC's ability to control and |
1384 | + * will cause the command ring is blocked. When it occurs software |
1385 | + * should intervene to recover the command ring. |
1386 | + * See Section 4.6.1.1 and 4.6.1.2 |
1387 | + */ |
1388 | +int xhci_cancel_cmd(struct xhci_hcd *xhci, struct xhci_command *command, |
1389 | + union xhci_trb *cmd_trb) |
1390 | +{ |
1391 | + int retval = 0; |
1392 | + unsigned long flags; |
1393 | + |
1394 | + spin_lock_irqsave(&xhci->lock, flags); |
1395 | + |
1396 | + if (xhci->xhc_state & XHCI_STATE_DYING) { |
1397 | + xhci_warn(xhci, "Abort the command ring," |
1398 | + " but the xHCI is dead.\n"); |
1399 | + retval = -ESHUTDOWN; |
1400 | + goto fail; |
1401 | + } |
1402 | + |
1403 | + /* queue the cmd desriptor to cancel_cmd_list */ |
1404 | + retval = xhci_queue_cd(xhci, command, cmd_trb); |
1405 | + if (retval) { |
1406 | + xhci_warn(xhci, "Queuing command descriptor failed.\n"); |
1407 | + goto fail; |
1408 | + } |
1409 | + |
1410 | + /* abort command ring */ |
1411 | + retval = xhci_abort_cmd_ring(xhci); |
1412 | + if (retval) { |
1413 | + xhci_err(xhci, "Abort command ring failed\n"); |
1414 | + if (unlikely(retval == -ESHUTDOWN)) { |
1415 | + spin_unlock_irqrestore(&xhci->lock, flags); |
1416 | + usb_hc_died(xhci_to_hcd(xhci)->primary_hcd); |
1417 | + xhci_dbg(xhci, "xHCI host controller is dead.\n"); |
1418 | + return retval; |
1419 | + } |
1420 | + } |
1421 | + |
1422 | +fail: |
1423 | + spin_unlock_irqrestore(&xhci->lock, flags); |
1424 | + return retval; |
1425 | +} |
1426 | + |
1427 | void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, |
1428 | unsigned int slot_id, |
1429 | unsigned int ep_index, |
1430 | @@ -1059,6 +1170,20 @@ static void handle_reset_ep_completion(struct xhci_hcd *xhci, |
1431 | } |
1432 | } |
1433 | |
1434 | +/* Complete the command and detele it from the devcie's command queue. |
1435 | + */ |
1436 | +static void xhci_complete_cmd_in_cmd_wait_list(struct xhci_hcd *xhci, |
1437 | + struct xhci_command *command, u32 status) |
1438 | +{ |
1439 | + command->status = status; |
1440 | + list_del(&command->cmd_list); |
1441 | + if (command->completion) |
1442 | + complete(command->completion); |
1443 | + else |
1444 | + xhci_free_command(xhci, command); |
1445 | +} |
1446 | + |
1447 | + |
1448 | /* Check to see if a command in the device's command queue matches this one. |
1449 | * Signal the completion or free the command, and return 1. Return 0 if the |
1450 | * completed command isn't at the head of the command list. |
1451 | @@ -1077,15 +1202,144 @@ static int handle_cmd_in_cmd_wait_list(struct xhci_hcd *xhci, |
1452 | if (xhci->cmd_ring->dequeue != command->command_trb) |
1453 | return 0; |
1454 | |
1455 | - command->status = GET_COMP_CODE(le32_to_cpu(event->status)); |
1456 | - list_del(&command->cmd_list); |
1457 | - if (command->completion) |
1458 | - complete(command->completion); |
1459 | - else |
1460 | - xhci_free_command(xhci, command); |
1461 | + xhci_complete_cmd_in_cmd_wait_list(xhci, command, |
1462 | + GET_COMP_CODE(le32_to_cpu(event->status))); |
1463 | return 1; |
1464 | } |
1465 | |
1466 | +/* |
1467 | + * Finding the command trb need to be cancelled and modifying it to |
1468 | + * NO OP command. And if the command is in device's command wait |
1469 | + * list, finishing and freeing it. |
1470 | + * |
1471 | + * If we can't find the command trb, we think it had already been |
1472 | + * executed. |
1473 | + */ |
1474 | +static void xhci_cmd_to_noop(struct xhci_hcd *xhci, struct xhci_cd *cur_cd) |
1475 | +{ |
1476 | + struct xhci_segment *cur_seg; |
1477 | + union xhci_trb *cmd_trb; |
1478 | + u32 cycle_state; |
1479 | + |
1480 | + if (xhci->cmd_ring->dequeue == xhci->cmd_ring->enqueue) |
1481 | + return; |
1482 | + |
1483 | + /* find the current segment of command ring */ |
1484 | + cur_seg = find_trb_seg(xhci->cmd_ring->first_seg, |
1485 | + xhci->cmd_ring->dequeue, &cycle_state); |
1486 | + |
1487 | + /* find the command trb matched by cd from command ring */ |
1488 | + for (cmd_trb = xhci->cmd_ring->dequeue; |
1489 | + cmd_trb != xhci->cmd_ring->enqueue; |
1490 | + next_trb(xhci, xhci->cmd_ring, &cur_seg, &cmd_trb)) { |
1491 | + /* If the trb is link trb, continue */ |
1492 | + if (TRB_TYPE_LINK_LE32(cmd_trb->generic.field[3])) |
1493 | + continue; |
1494 | + |
1495 | + if (cur_cd->cmd_trb == cmd_trb) { |
1496 | + |
1497 | + /* If the command in device's command list, we should |
1498 | + * finish it and free the command structure. |
1499 | + */ |
1500 | + if (cur_cd->command) |
1501 | + xhci_complete_cmd_in_cmd_wait_list(xhci, |
1502 | + cur_cd->command, COMP_CMD_STOP); |
1503 | + |
1504 | + /* get cycle state from the origin command trb */ |
1505 | + cycle_state = le32_to_cpu(cmd_trb->generic.field[3]) |
1506 | + & TRB_CYCLE; |
1507 | + |
1508 | + /* modify the command trb to NO OP command */ |
1509 | + cmd_trb->generic.field[0] = 0; |
1510 | + cmd_trb->generic.field[1] = 0; |
1511 | + cmd_trb->generic.field[2] = 0; |
1512 | + cmd_trb->generic.field[3] = cpu_to_le32( |
1513 | + TRB_TYPE(TRB_CMD_NOOP) | cycle_state); |
1514 | + break; |
1515 | + } |
1516 | + } |
1517 | +} |
1518 | + |
1519 | +static void xhci_cancel_cmd_in_cd_list(struct xhci_hcd *xhci) |
1520 | +{ |
1521 | + struct xhci_cd *cur_cd, *next_cd; |
1522 | + |
1523 | + if (list_empty(&xhci->cancel_cmd_list)) |
1524 | + return; |
1525 | + |
1526 | + list_for_each_entry_safe(cur_cd, next_cd, |
1527 | + &xhci->cancel_cmd_list, cancel_cmd_list) { |
1528 | + xhci_cmd_to_noop(xhci, cur_cd); |
1529 | + list_del(&cur_cd->cancel_cmd_list); |
1530 | + kfree(cur_cd); |
1531 | + } |
1532 | +} |
1533 | + |
1534 | +/* |
1535 | + * traversing the cancel_cmd_list. If the command descriptor according |
1536 | + * to cmd_trb is found, the function free it and return 1, otherwise |
1537 | + * return 0. |
1538 | + */ |
1539 | +static int xhci_search_cmd_trb_in_cd_list(struct xhci_hcd *xhci, |
1540 | + union xhci_trb *cmd_trb) |
1541 | +{ |
1542 | + struct xhci_cd *cur_cd, *next_cd; |
1543 | + |
1544 | + if (list_empty(&xhci->cancel_cmd_list)) |
1545 | + return 0; |
1546 | + |
1547 | + list_for_each_entry_safe(cur_cd, next_cd, |
1548 | + &xhci->cancel_cmd_list, cancel_cmd_list) { |
1549 | + if (cur_cd->cmd_trb == cmd_trb) { |
1550 | + if (cur_cd->command) |
1551 | + xhci_complete_cmd_in_cmd_wait_list(xhci, |
1552 | + cur_cd->command, COMP_CMD_STOP); |
1553 | + list_del(&cur_cd->cancel_cmd_list); |
1554 | + kfree(cur_cd); |
1555 | + return 1; |
1556 | + } |
1557 | + } |
1558 | + |
1559 | + return 0; |
1560 | +} |
1561 | + |
1562 | +/* |
1563 | + * If the cmd_trb_comp_code is COMP_CMD_ABORT, we just check whether the |
1564 | + * trb pointed by the command ring dequeue pointer is the trb we want to |
1565 | + * cancel or not. And if the cmd_trb_comp_code is COMP_CMD_STOP, we will |
1566 | + * traverse the cancel_cmd_list to trun the all of the commands according |
1567 | + * to command descriptor to NO-OP trb. |
1568 | + */ |
1569 | +static int handle_stopped_cmd_ring(struct xhci_hcd *xhci, |
1570 | + int cmd_trb_comp_code) |
1571 | +{ |
1572 | + int cur_trb_is_good = 0; |
1573 | + |
1574 | + /* Searching the cmd trb pointed by the command ring dequeue |
1575 | + * pointer in command descriptor list. If it is found, free it. |
1576 | + */ |
1577 | + cur_trb_is_good = xhci_search_cmd_trb_in_cd_list(xhci, |
1578 | + xhci->cmd_ring->dequeue); |
1579 | + |
1580 | + if (cmd_trb_comp_code == COMP_CMD_ABORT) |
1581 | + xhci->cmd_ring_state = CMD_RING_STATE_STOPPED; |
1582 | + else if (cmd_trb_comp_code == COMP_CMD_STOP) { |
1583 | + /* traversing the cancel_cmd_list and canceling |
1584 | + * the command according to command descriptor |
1585 | + */ |
1586 | + xhci_cancel_cmd_in_cd_list(xhci); |
1587 | + |
1588 | + xhci->cmd_ring_state = CMD_RING_STATE_RUNNING; |
1589 | + /* |
1590 | + * ring command ring doorbell again to restart the |
1591 | + * command ring |
1592 | + */ |
1593 | + if (xhci->cmd_ring->dequeue != xhci->cmd_ring->enqueue) |
1594 | + xhci_ring_cmd_db(xhci); |
1595 | + } |
1596 | + return cur_trb_is_good; |
1597 | +} |
1598 | + |
1599 | static void handle_cmd_completion(struct xhci_hcd *xhci, |
1600 | struct xhci_event_cmd *event) |
1601 | { |
1602 | @@ -1111,6 +1365,22 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, |
1603 | xhci->error_bitmask |= 1 << 5; |
1604 | return; |
1605 | } |
1606 | + |
1607 | + if ((GET_COMP_CODE(le32_to_cpu(event->status)) == COMP_CMD_ABORT) || |
1608 | + (GET_COMP_CODE(le32_to_cpu(event->status)) == COMP_CMD_STOP)) { |
1609 | + /* If the return value is 0, we think the trb pointed by |
1610 | + * command ring dequeue pointer is a good trb. The good |
1611 | + * trb means we don't want to cancel the trb, but it have |
1612 | + * been stopped by host. So we should handle it normally. |
1613 | + * Otherwise, driver should invoke inc_deq() and return. |
1614 | + */ |
1615 | + if (handle_stopped_cmd_ring(xhci, |
1616 | + GET_COMP_CODE(le32_to_cpu(event->status)))) { |
1617 | + inc_deq(xhci, xhci->cmd_ring); |
1618 | + return; |
1619 | + } |
1620 | + } |
1621 | + |
1622 | switch (le32_to_cpu(xhci->cmd_ring->dequeue->generic.field[3]) |
1623 | & TRB_TYPE_BITMASK) { |
1624 | case TRB_TYPE(TRB_ENABLE_SLOT): |
1625 | @@ -3400,7 +3670,9 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
1626 | } else { |
1627 | td->last_trb = ep_ring->enqueue; |
1628 | field |= TRB_IOC; |
1629 | - if (xhci->hci_version == 0x100) { |
1630 | + if (xhci->hci_version == 0x100 && |
1631 | + !(xhci->quirks & |
1632 | + XHCI_AVOID_BEI)) { |
1633 | /* Set BEI bit except for the last td */ |
1634 | if (i < num_tds - 1) |
1635 | field |= TRB_BEI; |
1636 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
1637 | index 6ece0ed..a49868d 100644 |
1638 | --- a/drivers/usb/host/xhci.c |
1639 | +++ b/drivers/usb/host/xhci.c |
1640 | @@ -52,7 +52,7 @@ MODULE_PARM_DESC(link_quirk, "Don't clear the chain bit on a link TRB"); |
1641 | * handshake done). There are two failure modes: "usec" have passed (major |
1642 | * hardware flakeout), or the register reads as all-ones (hardware removed). |
1643 | */ |
1644 | -static int handshake(struct xhci_hcd *xhci, void __iomem *ptr, |
1645 | +int handshake(struct xhci_hcd *xhci, void __iomem *ptr, |
1646 | u32 mask, u32 done, int usec) |
1647 | { |
1648 | u32 result; |
1649 | @@ -105,9 +105,10 @@ int xhci_halt(struct xhci_hcd *xhci) |
1650 | |
1651 | ret = handshake(xhci, &xhci->op_regs->status, |
1652 | STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC); |
1653 | - if (!ret) |
1654 | + if (!ret) { |
1655 | xhci->xhc_state |= XHCI_STATE_HALTED; |
1656 | - else |
1657 | + xhci->cmd_ring_state = CMD_RING_STATE_STOPPED; |
1658 | + } else |
1659 | xhci_warn(xhci, "Host not halted after %u microseconds.\n", |
1660 | XHCI_MAX_HALT_USEC); |
1661 | return ret; |
1662 | @@ -470,6 +471,8 @@ static bool compliance_mode_recovery_timer_quirk_check(void) |
1663 | |
1664 | dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME); |
1665 | dmi_sys_vendor = dmi_get_system_info(DMI_SYS_VENDOR); |
1666 | + if (!dmi_product_name || !dmi_sys_vendor) |
1667 | + return false; |
1668 | |
1669 | if (!(strstr(dmi_sys_vendor, "Hewlett-Packard"))) |
1670 | return false; |
1671 | @@ -581,6 +584,7 @@ static int xhci_run_finished(struct xhci_hcd *xhci) |
1672 | return -ENODEV; |
1673 | } |
1674 | xhci->shared_hcd->state = HC_STATE_RUNNING; |
1675 | + xhci->cmd_ring_state = CMD_RING_STATE_RUNNING; |
1676 | |
1677 | if (xhci->quirks & XHCI_NEC_HOST) |
1678 | xhci_ring_cmd_db(xhci); |
1679 | @@ -886,7 +890,7 @@ int xhci_suspend(struct xhci_hcd *xhci) |
1680 | command &= ~CMD_RUN; |
1681 | xhci_writel(xhci, command, &xhci->op_regs->command); |
1682 | if (handshake(xhci, &xhci->op_regs->status, |
1683 | - STS_HALT, STS_HALT, 100*100)) { |
1684 | + STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC)) { |
1685 | xhci_warn(xhci, "WARN: xHC CMD_RUN timeout\n"); |
1686 | spin_unlock_irq(&xhci->lock); |
1687 | return -ETIMEDOUT; |
1688 | @@ -2521,6 +2525,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, |
1689 | struct completion *cmd_completion; |
1690 | u32 *cmd_status; |
1691 | struct xhci_virt_device *virt_dev; |
1692 | + union xhci_trb *cmd_trb; |
1693 | |
1694 | spin_lock_irqsave(&xhci->lock, flags); |
1695 | virt_dev = xhci->devs[udev->slot_id]; |
1696 | @@ -2566,6 +2571,7 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, |
1697 | } |
1698 | init_completion(cmd_completion); |
1699 | |
1700 | + cmd_trb = xhci->cmd_ring->dequeue; |
1701 | if (!ctx_change) |
1702 | ret = xhci_queue_configure_endpoint(xhci, in_ctx->dma, |
1703 | udev->slot_id, must_succeed); |
1704 | @@ -2587,14 +2593,17 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci, |
1705 | /* Wait for the configure endpoint command to complete */ |
1706 | timeleft = wait_for_completion_interruptible_timeout( |
1707 | cmd_completion, |
1708 | - USB_CTRL_SET_TIMEOUT); |
1709 | + XHCI_CMD_DEFAULT_TIMEOUT); |
1710 | if (timeleft <= 0) { |
1711 | xhci_warn(xhci, "%s while waiting for %s command\n", |
1712 | timeleft == 0 ? "Timeout" : "Signal", |
1713 | ctx_change == 0 ? |
1714 | "configure endpoint" : |
1715 | "evaluate context"); |
1716 | - /* FIXME cancel the configure endpoint command */ |
1717 | + /* cancel the configure endpoint command */ |
1718 | + ret = xhci_cancel_cmd(xhci, command, cmd_trb); |
1719 | + if (ret < 0) |
1720 | + return ret; |
1721 | return -ETIME; |
1722 | } |
1723 | |
1724 | @@ -3543,8 +3552,10 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) |
1725 | unsigned long flags; |
1726 | int timeleft; |
1727 | int ret; |
1728 | + union xhci_trb *cmd_trb; |
1729 | |
1730 | spin_lock_irqsave(&xhci->lock, flags); |
1731 | + cmd_trb = xhci->cmd_ring->dequeue; |
1732 | ret = xhci_queue_slot_control(xhci, TRB_ENABLE_SLOT, 0); |
1733 | if (ret) { |
1734 | spin_unlock_irqrestore(&xhci->lock, flags); |
1735 | @@ -3556,12 +3567,12 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) |
1736 | |
1737 | /* XXX: how much time for xHC slot assignment? */ |
1738 | timeleft = wait_for_completion_interruptible_timeout(&xhci->addr_dev, |
1739 | - USB_CTRL_SET_TIMEOUT); |
1740 | + XHCI_CMD_DEFAULT_TIMEOUT); |
1741 | if (timeleft <= 0) { |
1742 | xhci_warn(xhci, "%s while waiting for a slot\n", |
1743 | timeleft == 0 ? "Timeout" : "Signal"); |
1744 | - /* FIXME cancel the enable slot request */ |
1745 | - return 0; |
1746 | + /* cancel the enable slot request */ |
1747 | + return xhci_cancel_cmd(xhci, NULL, cmd_trb); |
1748 | } |
1749 | |
1750 | if (!xhci->slot_id) { |
1751 | @@ -3622,6 +3633,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) |
1752 | struct xhci_slot_ctx *slot_ctx; |
1753 | struct xhci_input_control_ctx *ctrl_ctx; |
1754 | u64 temp_64; |
1755 | + union xhci_trb *cmd_trb; |
1756 | |
1757 | if (!udev->slot_id) { |
1758 | xhci_dbg(xhci, "Bad Slot ID %d\n", udev->slot_id); |
1759 | @@ -3660,6 +3672,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) |
1760 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2); |
1761 | |
1762 | spin_lock_irqsave(&xhci->lock, flags); |
1763 | + cmd_trb = xhci->cmd_ring->dequeue; |
1764 | ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma, |
1765 | udev->slot_id); |
1766 | if (ret) { |
1767 | @@ -3672,7 +3685,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) |
1768 | |
1769 | /* ctrl tx can take up to 5 sec; XXX: need more time for xHC? */ |
1770 | timeleft = wait_for_completion_interruptible_timeout(&xhci->addr_dev, |
1771 | - USB_CTRL_SET_TIMEOUT); |
1772 | + XHCI_CMD_DEFAULT_TIMEOUT); |
1773 | /* FIXME: From section 4.3.4: "Software shall be responsible for timing |
1774 | * the SetAddress() "recovery interval" required by USB and aborting the |
1775 | * command on a timeout. |
1776 | @@ -3680,7 +3693,10 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) |
1777 | if (timeleft <= 0) { |
1778 | xhci_warn(xhci, "%s while waiting for address device command\n", |
1779 | timeleft == 0 ? "Timeout" : "Signal"); |
1780 | - /* FIXME cancel the address device command */ |
1781 | + /* cancel the address device command */ |
1782 | + ret = xhci_cancel_cmd(xhci, NULL, cmd_trb); |
1783 | + if (ret < 0) |
1784 | + return ret; |
1785 | return -ETIME; |
1786 | } |
1787 | |
1788 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
1789 | index 1a05908..53df4e7 100644 |
1790 | --- a/drivers/usb/host/xhci.h |
1791 | +++ b/drivers/usb/host/xhci.h |
1792 | @@ -1256,6 +1256,16 @@ struct xhci_td { |
1793 | union xhci_trb *last_trb; |
1794 | }; |
1795 | |
1796 | +/* xHCI command default timeout value */ |
1797 | +#define XHCI_CMD_DEFAULT_TIMEOUT (5 * HZ) |
1798 | + |
1799 | +/* command descriptor */ |
1800 | +struct xhci_cd { |
1801 | + struct list_head cancel_cmd_list; |
1802 | + struct xhci_command *command; |
1803 | + union xhci_trb *cmd_trb; |
1804 | +}; |
1805 | + |
1806 | struct xhci_dequeue_state { |
1807 | struct xhci_segment *new_deq_seg; |
1808 | union xhci_trb *new_deq_ptr; |
1809 | @@ -1421,6 +1431,11 @@ struct xhci_hcd { |
1810 | /* data structures */ |
1811 | struct xhci_device_context_array *dcbaa; |
1812 | struct xhci_ring *cmd_ring; |
1813 | + unsigned int cmd_ring_state; |
1814 | +#define CMD_RING_STATE_RUNNING (1 << 0) |
1815 | +#define CMD_RING_STATE_ABORTED (1 << 1) |
1816 | +#define CMD_RING_STATE_STOPPED (1 << 2) |
1817 | + struct list_head cancel_cmd_list; |
1818 | unsigned int cmd_ring_reserved_trbs; |
1819 | struct xhci_ring *event_ring; |
1820 | struct xhci_erst erst; |
1821 | @@ -1496,6 +1511,7 @@ struct xhci_hcd { |
1822 | #define XHCI_INTEL_HOST (1 << 12) |
1823 | #define XHCI_SPURIOUS_REBOOT (1 << 13) |
1824 | #define XHCI_COMP_MODE_QUIRK (1 << 14) |
1825 | +#define XHCI_AVOID_BEI (1 << 15) |
1826 | unsigned int num_active_eps; |
1827 | unsigned int limit_active_eps; |
1828 | /* There are two roothubs to keep track of bus suspend info for */ |
1829 | @@ -1704,6 +1720,8 @@ static inline void xhci_unregister_plat(void) |
1830 | |
1831 | /* xHCI host controller glue */ |
1832 | typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); |
1833 | +int handshake(struct xhci_hcd *xhci, void __iomem *ptr, |
1834 | + u32 mask, u32 done, int usec); |
1835 | void xhci_quiesce(struct xhci_hcd *xhci); |
1836 | int xhci_halt(struct xhci_hcd *xhci); |
1837 | int xhci_reset(struct xhci_hcd *xhci); |
1838 | @@ -1794,6 +1812,8 @@ void xhci_queue_config_ep_quirk(struct xhci_hcd *xhci, |
1839 | unsigned int slot_id, unsigned int ep_index, |
1840 | struct xhci_dequeue_state *deq_state); |
1841 | void xhci_stop_endpoint_command_watchdog(unsigned long arg); |
1842 | +int xhci_cancel_cmd(struct xhci_hcd *xhci, struct xhci_command *command, |
1843 | + union xhci_trb *cmd_trb); |
1844 | void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, unsigned int slot_id, |
1845 | unsigned int ep_index, unsigned int stream_id); |
1846 | |
1847 | diff --git a/drivers/usb/otg/mxs-phy.c b/drivers/usb/otg/mxs-phy.c |
1848 | index c1a67cb..88db976 100644 |
1849 | --- a/drivers/usb/otg/mxs-phy.c |
1850 | +++ b/drivers/usb/otg/mxs-phy.c |
1851 | @@ -20,6 +20,7 @@ |
1852 | #include <linux/delay.h> |
1853 | #include <linux/err.h> |
1854 | #include <linux/io.h> |
1855 | +#include <linux/workqueue.h> |
1856 | |
1857 | #define DRIVER_NAME "mxs_phy" |
1858 | |
1859 | @@ -34,9 +35,16 @@ |
1860 | #define BM_USBPHY_CTRL_ENUTMILEVEL2 BIT(14) |
1861 | #define BM_USBPHY_CTRL_ENHOSTDISCONDETECT BIT(1) |
1862 | |
1863 | +/* |
1864 | + * Amount of delay in miliseconds to safely enable ENHOSTDISCONDETECT bit |
1865 | + * so that connection and reset processing can be completed for the root hub. |
1866 | + */ |
1867 | +#define MXY_PHY_ENHOSTDISCONDETECT_DELAY 250 |
1868 | + |
1869 | struct mxs_phy { |
1870 | struct usb_phy phy; |
1871 | struct clk *clk; |
1872 | + struct delayed_work enhostdiscondetect_work; |
1873 | }; |
1874 | |
1875 | #define to_mxs_phy(p) container_of((p), struct mxs_phy, phy) |
1876 | @@ -62,6 +70,7 @@ static int mxs_phy_init(struct usb_phy *phy) |
1877 | |
1878 | clk_prepare_enable(mxs_phy->clk); |
1879 | mxs_phy_hw_init(mxs_phy); |
1880 | + INIT_DELAYED_WORK(&mxs_phy->enhostdiscondetect_work, NULL); |
1881 | |
1882 | return 0; |
1883 | } |
1884 | @@ -76,13 +85,34 @@ static void mxs_phy_shutdown(struct usb_phy *phy) |
1885 | clk_disable_unprepare(mxs_phy->clk); |
1886 | } |
1887 | |
1888 | +static void mxs_phy_enhostdiscondetect_delay(struct work_struct *ws) |
1889 | +{ |
1890 | + struct mxs_phy *mxs_phy = container_of(ws, struct mxs_phy, |
1891 | + enhostdiscondetect_work.work); |
1892 | + |
1893 | + /* Enable HOSTDISCONDETECT after delay. */ |
1894 | + dev_dbg(mxs_phy->phy.dev, "Setting ENHOSTDISCONDETECT\n"); |
1895 | + writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT, |
1896 | + mxs_phy->phy.io_priv + HW_USBPHY_CTRL_SET); |
1897 | +} |
1898 | + |
1899 | static int mxs_phy_on_connect(struct usb_phy *phy, int port) |
1900 | { |
1901 | + struct mxs_phy *mxs_phy = to_mxs_phy(phy); |
1902 | + |
1903 | dev_dbg(phy->dev, "Connect on port %d\n", port); |
1904 | |
1905 | - mxs_phy_hw_init(to_mxs_phy(phy)); |
1906 | - writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT, |
1907 | - phy->io_priv + HW_USBPHY_CTRL_SET); |
1908 | + mxs_phy_hw_init(mxs_phy); |
1909 | + |
1910 | + /* |
1911 | + * Delay enabling ENHOSTDISCONDETECT so that connection and |
1912 | + * reset processing can be completed for the root hub. |
1913 | + */ |
1914 | + dev_dbg(phy->dev, "Delaying setting ENHOSTDISCONDETECT\n"); |
1915 | + PREPARE_DELAYED_WORK(&mxs_phy->enhostdiscondetect_work, |
1916 | + mxs_phy_enhostdiscondetect_delay); |
1917 | + schedule_delayed_work(&mxs_phy->enhostdiscondetect_work, |
1918 | + msecs_to_jiffies(MXY_PHY_ENHOSTDISCONDETECT_DELAY)); |
1919 | |
1920 | return 0; |
1921 | } |
1922 | @@ -91,6 +121,8 @@ static int mxs_phy_on_disconnect(struct usb_phy *phy, int port) |
1923 | { |
1924 | dev_dbg(phy->dev, "Disconnect on port %d\n", port); |
1925 | |
1926 | + /* No need to delay before clearing ENHOSTDISCONDETECT. */ |
1927 | + dev_dbg(phy->dev, "Clearing ENHOSTDISCONDETECT\n"); |
1928 | writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT, |
1929 | phy->io_priv + HW_USBPHY_CTRL_CLR); |
1930 | |
1931 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
1932 | index f906b3a..b71ee32 100644 |
1933 | --- a/drivers/usb/serial/ftdi_sio.c |
1934 | +++ b/drivers/usb/serial/ftdi_sio.c |
1935 | @@ -584,6 +584,8 @@ static struct usb_device_id id_table_combined [] = { |
1936 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) }, |
1937 | { USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) }, |
1938 | { USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) }, |
1939 | + { USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID), |
1940 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1941 | /* |
1942 | * ELV devices: |
1943 | */ |
1944 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
1945 | index 41fe582..57c12ef 100644 |
1946 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
1947 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
1948 | @@ -517,6 +517,11 @@ |
1949 | */ |
1950 | #define FTDI_TAVIR_STK500_PID 0xFA33 /* STK500 AVR programmer */ |
1951 | |
1952 | +/* |
1953 | + * TIAO product ids (FTDI_VID) |
1954 | + * http://www.tiaowiki.com/w/Main_Page |
1955 | + */ |
1956 | +#define FTDI_TIAO_UMPA_PID 0x8a98 /* TIAO/DIYGADGET USB Multi-Protocol Adapter */ |
1957 | |
1958 | |
1959 | /********************************/ |
1960 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
1961 | index 5ce88d1..5f30800 100644 |
1962 | --- a/drivers/usb/serial/option.c |
1963 | +++ b/drivers/usb/serial/option.c |
1964 | @@ -870,7 +870,8 @@ static const struct usb_device_id option_ids[] = { |
1965 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0153, 0xff, 0xff, 0xff) }, |
1966 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0155, 0xff, 0xff, 0xff) }, |
1967 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, |
1968 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff) }, |
1969 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff), |
1970 | + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
1971 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) }, |
1972 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, |
1973 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, |
1974 | diff --git a/drivers/usb/serial/qcaux.c b/drivers/usb/serial/qcaux.c |
1975 | index a4edc7e..9b1b96f 100644 |
1976 | --- a/drivers/usb/serial/qcaux.c |
1977 | +++ b/drivers/usb/serial/qcaux.c |
1978 | @@ -36,8 +36,6 @@ |
1979 | #define UTSTARCOM_PRODUCT_UM175_V1 0x3712 |
1980 | #define UTSTARCOM_PRODUCT_UM175_V2 0x3714 |
1981 | #define UTSTARCOM_PRODUCT_UM175_ALLTEL 0x3715 |
1982 | -#define PANTECH_PRODUCT_UML190_VZW 0x3716 |
1983 | -#define PANTECH_PRODUCT_UML290_VZW 0x3718 |
1984 | |
1985 | /* CMOTECH devices */ |
1986 | #define CMOTECH_VENDOR_ID 0x16d8 |
1987 | @@ -68,11 +66,9 @@ static struct usb_device_id id_table[] = { |
1988 | { USB_DEVICE_AND_INTERFACE_INFO(LG_VENDOR_ID, LG_PRODUCT_VX4400_6000, 0xff, 0xff, 0x00) }, |
1989 | { USB_DEVICE_AND_INTERFACE_INFO(SANYO_VENDOR_ID, SANYO_PRODUCT_KATANA_LX, 0xff, 0xff, 0x00) }, |
1990 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_U520, 0xff, 0x00, 0x00) }, |
1991 | - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xff, 0xff) }, |
1992 | - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xfe, 0xff) }, |
1993 | - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfd, 0xff) }, /* NMEA */ |
1994 | - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfe, 0xff) }, /* WMC */ |
1995 | - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xff, 0xff) }, /* DIAG */ |
1996 | + { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfd, 0xff) }, /* NMEA */ |
1997 | + { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfe, 0xff) }, /* WMC */ |
1998 | + { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xff, 0xff) }, /* DIAG */ |
1999 | { }, |
2000 | }; |
2001 | MODULE_DEVICE_TABLE(usb, id_table); |
2002 | diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c |
2003 | index 27483f9..667c39c 100644 |
2004 | --- a/drivers/usb/serial/usb-serial.c |
2005 | +++ b/drivers/usb/serial/usb-serial.c |
2006 | @@ -1426,9 +1426,10 @@ int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[] |
2007 | |
2008 | /* we only set the reset_resume field if the serial_driver has one */ |
2009 | for (sd = serial_drivers; *sd; ++sd) { |
2010 | - if ((*sd)->reset_resume) |
2011 | + if ((*sd)->reset_resume) { |
2012 | udriver->reset_resume = usb_serial_reset_resume; |
2013 | break; |
2014 | + } |
2015 | } |
2016 | |
2017 | rc = usb_register(udriver); |
2018 | diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c |
2019 | index 0334272..77c9f76 100644 |
2020 | --- a/drivers/xen/xen-pciback/pci_stub.c |
2021 | +++ b/drivers/xen/xen-pciback/pci_stub.c |
2022 | @@ -362,6 +362,7 @@ static int __devinit pcistub_init_device(struct pci_dev *dev) |
2023 | else { |
2024 | dev_dbg(&dev->dev, "reseting (FLR, D3, etc) the device\n"); |
2025 | __pci_reset_function_locked(dev); |
2026 | + pci_restore_state(dev); |
2027 | } |
2028 | /* Now disable the device (this also ensures some private device |
2029 | * data is setup before we export) |
2030 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c |
2031 | index 1b52956..0225fdd 100644 |
2032 | --- a/fs/binfmt_elf.c |
2033 | +++ b/fs/binfmt_elf.c |
2034 | @@ -1696,30 +1696,19 @@ static int elf_note_info_init(struct elf_note_info *info) |
2035 | return 0; |
2036 | info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL); |
2037 | if (!info->psinfo) |
2038 | - goto notes_free; |
2039 | + return 0; |
2040 | info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL); |
2041 | if (!info->prstatus) |
2042 | - goto psinfo_free; |
2043 | + return 0; |
2044 | info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL); |
2045 | if (!info->fpu) |
2046 | - goto prstatus_free; |
2047 | + return 0; |
2048 | #ifdef ELF_CORE_COPY_XFPREGS |
2049 | info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL); |
2050 | if (!info->xfpu) |
2051 | - goto fpu_free; |
2052 | + return 0; |
2053 | #endif |
2054 | return 1; |
2055 | -#ifdef ELF_CORE_COPY_XFPREGS |
2056 | - fpu_free: |
2057 | - kfree(info->fpu); |
2058 | -#endif |
2059 | - prstatus_free: |
2060 | - kfree(info->prstatus); |
2061 | - psinfo_free: |
2062 | - kfree(info->psinfo); |
2063 | - notes_free: |
2064 | - kfree(info->notes); |
2065 | - return 0; |
2066 | } |
2067 | |
2068 | static int fill_note_info(struct elfhdr *elf, int phdrs, |
2069 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h |
2070 | index 6b4565c..8d3c427 100644 |
2071 | --- a/include/linux/pci_ids.h |
2072 | +++ b/include/linux/pci_ids.h |
2073 | @@ -1847,7 +1847,6 @@ |
2074 | #define PCI_DEVICE_ID_SIIG_8S_20x_650 0x2081 |
2075 | #define PCI_DEVICE_ID_SIIG_8S_20x_850 0x2082 |
2076 | #define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL 0x2050 |
2077 | -#define PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL 0x2530 |
2078 | |
2079 | #define PCI_VENDOR_ID_RADISYS 0x1331 |
2080 | |
2081 | diff --git a/security/yama/yama_lsm.c b/security/yama/yama_lsm.c |
2082 | index 0cc99a3..dcd6178 100644 |
2083 | --- a/security/yama/yama_lsm.c |
2084 | +++ b/security/yama/yama_lsm.c |
2085 | @@ -143,7 +143,7 @@ static int yama_task_prctl(int option, unsigned long arg2, unsigned long arg3, |
2086 | if (arg2 == 0) { |
2087 | yama_ptracer_del(NULL, myself); |
2088 | rc = 0; |
2089 | - } else if (arg2 == PR_SET_PTRACER_ANY) { |
2090 | + } else if (arg2 == PR_SET_PTRACER_ANY || (int)arg2 == -1) { |
2091 | rc = yama_ptracer_add(NULL, myself); |
2092 | } else { |
2093 | struct task_struct *tracer; |
2094 | diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c |
2095 | index d9834b3..2984ffb 100644 |
2096 | --- a/tools/hv/hv_kvp_daemon.c |
2097 | +++ b/tools/hv/hv_kvp_daemon.c |
2098 | @@ -106,7 +106,7 @@ static void kvp_acquire_lock(int pool) |
2099 | |
2100 | if (fcntl(kvp_file_info[pool].fd, F_SETLKW, &fl) == -1) { |
2101 | syslog(LOG_ERR, "Failed to acquire the lock pool: %d", pool); |
2102 | - exit(-1); |
2103 | + exit(EXIT_FAILURE); |
2104 | } |
2105 | } |
2106 | |
2107 | @@ -118,7 +118,7 @@ static void kvp_release_lock(int pool) |
2108 | if (fcntl(kvp_file_info[pool].fd, F_SETLK, &fl) == -1) { |
2109 | perror("fcntl"); |
2110 | syslog(LOG_ERR, "Failed to release the lock pool: %d", pool); |
2111 | - exit(-1); |
2112 | + exit(EXIT_FAILURE); |
2113 | } |
2114 | } |
2115 | |
2116 | @@ -137,14 +137,19 @@ static void kvp_update_file(int pool) |
2117 | if (!filep) { |
2118 | kvp_release_lock(pool); |
2119 | syslog(LOG_ERR, "Failed to open file, pool: %d", pool); |
2120 | - exit(-1); |
2121 | + exit(EXIT_FAILURE); |
2122 | } |
2123 | |
2124 | bytes_written = fwrite(kvp_file_info[pool].records, |
2125 | sizeof(struct kvp_record), |
2126 | kvp_file_info[pool].num_records, filep); |
2127 | |
2128 | - fflush(filep); |
2129 | + if (ferror(filep) || fclose(filep)) { |
2130 | + kvp_release_lock(pool); |
2131 | + syslog(LOG_ERR, "Failed to write file, pool: %d", pool); |
2132 | + exit(EXIT_FAILURE); |
2133 | + } |
2134 | + |
2135 | kvp_release_lock(pool); |
2136 | } |
2137 | |
2138 | @@ -163,14 +168,19 @@ static void kvp_update_mem_state(int pool) |
2139 | if (!filep) { |
2140 | kvp_release_lock(pool); |
2141 | syslog(LOG_ERR, "Failed to open file, pool: %d", pool); |
2142 | - exit(-1); |
2143 | + exit(EXIT_FAILURE); |
2144 | } |
2145 | - while (!feof(filep)) { |
2146 | + for (;;) { |
2147 | readp = &record[records_read]; |
2148 | records_read += fread(readp, sizeof(struct kvp_record), |
2149 | ENTRIES_PER_BLOCK * num_blocks, |
2150 | filep); |
2151 | |
2152 | + if (ferror(filep)) { |
2153 | + syslog(LOG_ERR, "Failed to read file, pool: %d", pool); |
2154 | + exit(EXIT_FAILURE); |
2155 | + } |
2156 | + |
2157 | if (!feof(filep)) { |
2158 | /* |
2159 | * We have more data to read. |
2160 | @@ -180,7 +190,7 @@ static void kvp_update_mem_state(int pool) |
2161 | |
2162 | if (record == NULL) { |
2163 | syslog(LOG_ERR, "malloc failed"); |
2164 | - exit(-1); |
2165 | + exit(EXIT_FAILURE); |
2166 | } |
2167 | continue; |
2168 | } |
2169 | @@ -191,6 +201,7 @@ static void kvp_update_mem_state(int pool) |
2170 | kvp_file_info[pool].records = record; |
2171 | kvp_file_info[pool].num_records = records_read; |
2172 | |
2173 | + fclose(filep); |
2174 | kvp_release_lock(pool); |
2175 | } |
2176 | static int kvp_file_init(void) |
2177 | @@ -208,7 +219,7 @@ static int kvp_file_init(void) |
2178 | if (access("/var/opt/hyperv", F_OK)) { |
2179 | if (mkdir("/var/opt/hyperv", S_IRUSR | S_IWUSR | S_IROTH)) { |
2180 | syslog(LOG_ERR, " Failed to create /var/opt/hyperv"); |
2181 | - exit(-1); |
2182 | + exit(EXIT_FAILURE); |
2183 | } |
2184 | } |
2185 | |
2186 | @@ -232,12 +243,18 @@ static int kvp_file_init(void) |
2187 | fclose(filep); |
2188 | return 1; |
2189 | } |
2190 | - while (!feof(filep)) { |
2191 | + for (;;) { |
2192 | readp = &record[records_read]; |
2193 | records_read += fread(readp, sizeof(struct kvp_record), |
2194 | ENTRIES_PER_BLOCK, |
2195 | filep); |
2196 | |
2197 | + if (ferror(filep)) { |
2198 | + syslog(LOG_ERR, "Failed to read file, pool: %d", |
2199 | + i); |
2200 | + exit(EXIT_FAILURE); |
2201 | + } |
2202 | + |
2203 | if (!feof(filep)) { |
2204 | /* |
2205 | * We have more data to read. |
2206 | @@ -657,13 +674,13 @@ int main(void) |
2207 | |
2208 | if (kvp_file_init()) { |
2209 | syslog(LOG_ERR, "Failed to initialize the pools"); |
2210 | - exit(-1); |
2211 | + exit(EXIT_FAILURE); |
2212 | } |
2213 | |
2214 | fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR); |
2215 | if (fd < 0) { |
2216 | syslog(LOG_ERR, "netlink socket creation failed; error:%d", fd); |
2217 | - exit(-1); |
2218 | + exit(EXIT_FAILURE); |
2219 | } |
2220 | addr.nl_family = AF_NETLINK; |
2221 | addr.nl_pad = 0; |
2222 | @@ -675,7 +692,7 @@ int main(void) |
2223 | if (error < 0) { |
2224 | syslog(LOG_ERR, "bind failed; error:%d", error); |
2225 | close(fd); |
2226 | - exit(-1); |
2227 | + exit(EXIT_FAILURE); |
2228 | } |
2229 | sock_opt = addr.nl_groups; |
2230 | setsockopt(fd, 270, 1, &sock_opt, sizeof(sock_opt)); |
2231 | @@ -695,7 +712,7 @@ int main(void) |
2232 | if (len < 0) { |
2233 | syslog(LOG_ERR, "netlink_send failed; error:%d", len); |
2234 | close(fd); |
2235 | - exit(-1); |
2236 | + exit(EXIT_FAILURE); |
2237 | } |
2238 | |
2239 | pfd.fd = fd; |
2240 | @@ -863,7 +880,7 @@ kvp_done: |
2241 | len = netlink_send(fd, incoming_cn_msg); |
2242 | if (len < 0) { |
2243 | syslog(LOG_ERR, "net_link send failed; error:%d", len); |
2244 | - exit(-1); |
2245 | + exit(EXIT_FAILURE); |
2246 | } |
2247 | } |
2248 |