1 |
Author: mpagano |
2 |
Date: 2009-01-14 23:23:56 +0000 (Wed, 14 Jan 2009) |
3 |
New Revision: 1462 |
4 |
|
5 |
Added: |
6 |
genpatches-2.6/trunk/2.6.27/1010_linux-2.6.27.11.patch |
7 |
Modified: |
8 |
genpatches-2.6/trunk/2.6.27/0000_README |
9 |
Log: |
10 |
Linux patch version 2.6.27.11 |
11 |
|
12 |
Modified: genpatches-2.6/trunk/2.6.27/0000_README |
13 |
=================================================================== |
14 |
--- genpatches-2.6/trunk/2.6.27/0000_README 2009-01-12 20:14:08 UTC (rev 1461) |
15 |
+++ genpatches-2.6/trunk/2.6.27/0000_README 2009-01-14 23:23:56 UTC (rev 1462) |
16 |
@@ -79,6 +79,10 @@ |
17 |
From: http://www.kernel.org |
18 |
Desc: Linux 2.6.27.10 |
19 |
|
20 |
+Patch: 1010_linux-2.6.27.11.patch |
21 |
+From: http://www.kernel.org |
22 |
+Desc: Linux 2.6.27.11 |
23 |
+ |
24 |
Patch: 1700_sparc-poweroff-hang.patch |
25 |
From: http://bugs.gentoo.org/229441 |
26 |
Desc: Fix shutdown hang on Sun Blade 100 |
27 |
|
28 |
Added: genpatches-2.6/trunk/2.6.27/1010_linux-2.6.27.11.patch |
29 |
=================================================================== |
30 |
--- genpatches-2.6/trunk/2.6.27/1010_linux-2.6.27.11.patch (rev 0) |
31 |
+++ genpatches-2.6/trunk/2.6.27/1010_linux-2.6.27.11.patch 2009-01-14 23:23:56 UTC (rev 1462) |
32 |
@@ -0,0 +1,460 @@ |
33 |
+diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c |
34 |
+index 29b2941..45907c1 100644 |
35 |
+--- a/arch/powerpc/lib/rheap.c |
36 |
++++ b/arch/powerpc/lib/rheap.c |
37 |
+@@ -556,6 +556,7 @@ unsigned long rh_alloc_fixed(rh_info_t * info, unsigned long start, int size, co |
38 |
+ be = blk->start + blk->size; |
39 |
+ if (s >= bs && e <= be) |
40 |
+ break; |
41 |
++ blk = NULL; |
42 |
+ } |
43 |
+ |
44 |
+ if (blk == NULL) |
45 |
+diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c |
46 |
+index 042fdc2..20804d0 100644 |
47 |
+--- a/arch/x86/kernel/amd_iommu.c |
48 |
++++ b/arch/x86/kernel/amd_iommu.c |
49 |
+@@ -235,7 +235,7 @@ static int iommu_map(struct protection_domain *dom, |
50 |
+ u64 __pte, *pte, *page; |
51 |
+ |
52 |
+ bus_addr = PAGE_ALIGN(bus_addr); |
53 |
+- phys_addr = PAGE_ALIGN(bus_addr); |
54 |
++ phys_addr = PAGE_ALIGN(phys_addr); |
55 |
+ |
56 |
+ /* only support 512GB address spaces for now */ |
57 |
+ if (bus_addr > IOMMU_MAP_SIZE_L3 || !(prot & IOMMU_PROT_MASK)) |
58 |
+@@ -487,7 +487,7 @@ static void dma_ops_free_pagetable(struct dma_ops_domain *dma_dom) |
59 |
+ continue; |
60 |
+ |
61 |
+ p2 = IOMMU_PTE_PAGE(p1[i]); |
62 |
+- for (j = 0; j < 512; ++i) { |
63 |
++ for (j = 0; j < 512; ++j) { |
64 |
+ if (!IOMMU_PTE_PRESENT(p2[j])) |
65 |
+ continue; |
66 |
+ p3 = IOMMU_PTE_PAGE(p2[j]); |
67 |
+diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c |
68 |
+index a1378c4..923e682 100644 |
69 |
+--- a/arch/x86/kernel/amd_iommu_init.c |
70 |
++++ b/arch/x86/kernel/amd_iommu_init.c |
71 |
+@@ -407,6 +407,10 @@ static u8 * __init alloc_command_buffer(struct amd_iommu *iommu) |
72 |
+ memcpy_toio(iommu->mmio_base + MMIO_CMD_BUF_OFFSET, |
73 |
+ &entry, sizeof(entry)); |
74 |
+ |
75 |
++ /* set head and tail to zero manually */ |
76 |
++ writel(0x00, iommu->mmio_base + MMIO_CMD_HEAD_OFFSET); |
77 |
++ writel(0x00, iommu->mmio_base + MMIO_CMD_TAIL_OFFSET); |
78 |
++ |
79 |
+ iommu_feature_enable(iommu, CONTROL_CMDBUF_EN); |
80 |
+ |
81 |
+ return cmd_buf; |
82 |
+@@ -926,7 +930,8 @@ int __init amd_iommu_init(void) |
83 |
+ goto free; |
84 |
+ |
85 |
+ /* IOMMU rlookup table - find the IOMMU for a specific device */ |
86 |
+- amd_iommu_rlookup_table = (void *)__get_free_pages(GFP_KERNEL, |
87 |
++ amd_iommu_rlookup_table = (void *)__get_free_pages( |
88 |
++ GFP_KERNEL | __GFP_ZERO, |
89 |
+ get_order(rlookup_table_size)); |
90 |
+ if (amd_iommu_rlookup_table == NULL) |
91 |
+ goto free; |
92 |
+diff --git a/crypto/async_tx/async_xor.c b/crypto/async_tx/async_xor.c |
93 |
+index c029d3e..595b786 100644 |
94 |
+--- a/crypto/async_tx/async_xor.c |
95 |
++++ b/crypto/async_tx/async_xor.c |
96 |
+@@ -53,10 +53,17 @@ do_async_xor(struct dma_chan *chan, struct page *dest, struct page **src_list, |
97 |
+ int xor_src_cnt; |
98 |
+ dma_addr_t dma_dest; |
99 |
+ |
100 |
+- dma_dest = dma_map_page(dma->dev, dest, offset, len, DMA_FROM_DEVICE); |
101 |
+- for (i = 0; i < src_cnt; i++) |
102 |
++ /* map the dest bidrectional in case it is re-used as a source */ |
103 |
++ dma_dest = dma_map_page(dma->dev, dest, offset, len, DMA_BIDIRECTIONAL); |
104 |
++ for (i = 0; i < src_cnt; i++) { |
105 |
++ /* only map the dest once */ |
106 |
++ if (unlikely(src_list[i] == dest)) { |
107 |
++ dma_src[i] = dma_dest; |
108 |
++ continue; |
109 |
++ } |
110 |
+ dma_src[i] = dma_map_page(dma->dev, src_list[i], offset, |
111 |
+ len, DMA_TO_DEVICE); |
112 |
++ } |
113 |
+ |
114 |
+ while (src_cnt) { |
115 |
+ async_flags = flags; |
116 |
+diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c |
117 |
+index 2ac91b8..ee1eb5e 100644 |
118 |
+--- a/drivers/block/cciss.c |
119 |
++++ b/drivers/block/cciss.c |
120 |
+@@ -1692,6 +1692,11 @@ static int rebuild_lun_table(ctlr_info_t *h, int first_time) |
121 |
+ for (i = 0; i <= h->highest_lun; i++) { |
122 |
+ int j; |
123 |
+ drv_found = 0; |
124 |
++ |
125 |
++ /* skip holes in the array from already deleted drives */ |
126 |
++ if (h->drv[i].raid_level == -1) |
127 |
++ continue; |
128 |
++ |
129 |
+ for (j = 0; j < num_luns; j++) { |
130 |
+ memcpy(&lunid, &ld_buff->LUN[j][0], 4); |
131 |
+ lunid = le32_to_cpu(lunid); |
132 |
+diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c |
133 |
+index dc003a3..53bb74b 100644 |
134 |
+--- a/drivers/dma/dmaengine.c |
135 |
++++ b/drivers/dma/dmaengine.c |
136 |
+@@ -388,7 +388,10 @@ int dma_async_device_register(struct dma_device *device) |
137 |
+ |
138 |
+ init_completion(&device->done); |
139 |
+ kref_init(&device->refcount); |
140 |
++ |
141 |
++ mutex_lock(&dma_list_mutex); |
142 |
+ device->dev_id = id++; |
143 |
++ mutex_unlock(&dma_list_mutex); |
144 |
+ |
145 |
+ /* represent channels in sysfs. Probably want devs too */ |
146 |
+ list_for_each_entry(chan, &device->channels, device_node) { |
147 |
+diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c |
148 |
+index 3f4db54..56790f8 100644 |
149 |
+--- a/drivers/dma/ioat_dma.c |
150 |
++++ b/drivers/dma/ioat_dma.c |
151 |
+@@ -1337,10 +1337,12 @@ static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan) |
152 |
+ */ |
153 |
+ #define IOAT_TEST_SIZE 2000 |
154 |
+ |
155 |
++DECLARE_COMPLETION(test_completion); |
156 |
+ static void ioat_dma_test_callback(void *dma_async_param) |
157 |
+ { |
158 |
+ printk(KERN_ERR "ioatdma: ioat_dma_test_callback(%p)\n", |
159 |
+ dma_async_param); |
160 |
++ complete(&test_completion); |
161 |
+ } |
162 |
+ |
163 |
+ /** |
164 |
+@@ -1406,7 +1408,8 @@ static int ioat_dma_self_test(struct ioatdma_device *device) |
165 |
+ goto free_resources; |
166 |
+ } |
167 |
+ device->common.device_issue_pending(dma_chan); |
168 |
+- msleep(1); |
169 |
++ |
170 |
++ wait_for_completion_timeout(&test_completion, msecs_to_jiffies(3000)); |
171 |
+ |
172 |
+ if (device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL) |
173 |
+ != DMA_SUCCESS) { |
174 |
+diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c |
175 |
+index 71fba82..cbb7ab8 100644 |
176 |
+--- a/drivers/dma/iop-adma.c |
177 |
++++ b/drivers/dma/iop-adma.c |
178 |
+@@ -85,18 +85,28 @@ iop_adma_run_tx_complete_actions(struct iop_adma_desc_slot *desc, |
179 |
+ enum dma_ctrl_flags flags = desc->async_tx.flags; |
180 |
+ u32 src_cnt; |
181 |
+ dma_addr_t addr; |
182 |
++ dma_addr_t dest; |
183 |
+ |
184 |
++ src_cnt = unmap->unmap_src_cnt; |
185 |
++ dest = iop_desc_get_dest_addr(unmap, iop_chan); |
186 |
+ if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) { |
187 |
+- addr = iop_desc_get_dest_addr(unmap, iop_chan); |
188 |
+- dma_unmap_page(dev, addr, len, DMA_FROM_DEVICE); |
189 |
++ enum dma_data_direction dir; |
190 |
++ |
191 |
++ if (src_cnt > 1) /* is xor? */ |
192 |
++ dir = DMA_BIDIRECTIONAL; |
193 |
++ else |
194 |
++ dir = DMA_FROM_DEVICE; |
195 |
++ |
196 |
++ dma_unmap_page(dev, dest, len, dir); |
197 |
+ } |
198 |
+ |
199 |
+ if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { |
200 |
+- src_cnt = unmap->unmap_src_cnt; |
201 |
+ while (src_cnt--) { |
202 |
+ addr = iop_desc_get_src_addr(unmap, |
203 |
+ iop_chan, |
204 |
+ src_cnt); |
205 |
++ if (addr == dest) |
206 |
++ continue; |
207 |
+ dma_unmap_page(dev, addr, len, |
208 |
+ DMA_TO_DEVICE); |
209 |
+ } |
210 |
+diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c |
211 |
+index 0328da0..bcda174 100644 |
212 |
+--- a/drivers/dma/mv_xor.c |
213 |
++++ b/drivers/dma/mv_xor.c |
214 |
+@@ -311,17 +311,26 @@ mv_xor_run_tx_complete_actions(struct mv_xor_desc_slot *desc, |
215 |
+ enum dma_ctrl_flags flags = desc->async_tx.flags; |
216 |
+ u32 src_cnt; |
217 |
+ dma_addr_t addr; |
218 |
++ dma_addr_t dest; |
219 |
+ |
220 |
++ src_cnt = unmap->unmap_src_cnt; |
221 |
++ dest = mv_desc_get_dest_addr(unmap); |
222 |
+ if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) { |
223 |
+- addr = mv_desc_get_dest_addr(unmap); |
224 |
+- dma_unmap_page(dev, addr, len, DMA_FROM_DEVICE); |
225 |
++ enum dma_data_direction dir; |
226 |
++ |
227 |
++ if (src_cnt > 1) /* is xor ? */ |
228 |
++ dir = DMA_BIDIRECTIONAL; |
229 |
++ else |
230 |
++ dir = DMA_FROM_DEVICE; |
231 |
++ dma_unmap_page(dev, dest, len, dir); |
232 |
+ } |
233 |
+ |
234 |
+ if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { |
235 |
+- src_cnt = unmap->unmap_src_cnt; |
236 |
+ while (src_cnt--) { |
237 |
+ addr = mv_desc_get_src_addr(unmap, |
238 |
+ src_cnt); |
239 |
++ if (addr == dest) |
240 |
++ continue; |
241 |
+ dma_unmap_page(dev, addr, len, |
242 |
+ DMA_TO_DEVICE); |
243 |
+ } |
244 |
+diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c |
245 |
+index ac89a5d..ab7c8e4 100644 |
246 |
+--- a/drivers/md/bitmap.c |
247 |
++++ b/drivers/md/bitmap.c |
248 |
+@@ -208,16 +208,19 @@ static void bitmap_checkfree(struct bitmap *bitmap, unsigned long page) |
249 |
+ */ |
250 |
+ |
251 |
+ /* IO operations when bitmap is stored near all superblocks */ |
252 |
+-static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long index) |
253 |
++static struct page *read_sb_page(mddev_t *mddev, long offset, |
254 |
++ struct page *page, |
255 |
++ unsigned long index, int size) |
256 |
+ { |
257 |
+ /* choose a good rdev and read the page from there */ |
258 |
+ |
259 |
+ mdk_rdev_t *rdev; |
260 |
+ struct list_head *tmp; |
261 |
+- struct page *page = alloc_page(GFP_KERNEL); |
262 |
+ sector_t target; |
263 |
+ |
264 |
+ if (!page) |
265 |
++ page = alloc_page(GFP_KERNEL); |
266 |
++ if (!page) |
267 |
+ return ERR_PTR(-ENOMEM); |
268 |
+ |
269 |
+ rdev_for_each(rdev, tmp, mddev) { |
270 |
+@@ -227,7 +230,9 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde |
271 |
+ |
272 |
+ target = rdev->sb_start + offset + index * (PAGE_SIZE/512); |
273 |
+ |
274 |
+- if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) { |
275 |
++ if (sync_page_io(rdev->bdev, target, |
276 |
++ roundup(size, bdev_hardsect_size(rdev->bdev)), |
277 |
++ page, READ)) { |
278 |
+ page->index = index; |
279 |
+ attach_page_buffers(page, NULL); /* so that free_buffer will |
280 |
+ * quietly no-op */ |
281 |
+@@ -544,7 +549,9 @@ static int bitmap_read_sb(struct bitmap *bitmap) |
282 |
+ |
283 |
+ bitmap->sb_page = read_page(bitmap->file, 0, bitmap, bytes); |
284 |
+ } else { |
285 |
+- bitmap->sb_page = read_sb_page(bitmap->mddev, bitmap->offset, 0); |
286 |
++ bitmap->sb_page = read_sb_page(bitmap->mddev, bitmap->offset, |
287 |
++ NULL, |
288 |
++ 0, sizeof(bitmap_super_t)); |
289 |
+ } |
290 |
+ if (IS_ERR(bitmap->sb_page)) { |
291 |
+ err = PTR_ERR(bitmap->sb_page); |
292 |
+@@ -957,11 +964,16 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start) |
293 |
+ */ |
294 |
+ page = bitmap->sb_page; |
295 |
+ offset = sizeof(bitmap_super_t); |
296 |
++ read_sb_page(bitmap->mddev, bitmap->offset, |
297 |
++ page, |
298 |
++ index, count); |
299 |
+ } else if (file) { |
300 |
+ page = read_page(file, index, bitmap, count); |
301 |
+ offset = 0; |
302 |
+ } else { |
303 |
+- page = read_sb_page(bitmap->mddev, bitmap->offset, index); |
304 |
++ page = read_sb_page(bitmap->mddev, bitmap->offset, |
305 |
++ NULL, |
306 |
++ index, count); |
307 |
+ offset = 0; |
308 |
+ } |
309 |
+ if (IS_ERR(page)) { /* read error */ |
310 |
+diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c |
311 |
+index 1d2ef8f..5a40f2d 100644 |
312 |
+--- a/drivers/net/starfire.c |
313 |
++++ b/drivers/net/starfire.c |
314 |
+@@ -1509,6 +1509,11 @@ static int __netdev_rx(struct net_device *dev, int *quota) |
315 |
+ desc->status = 0; |
316 |
+ np->rx_done = (np->rx_done + 1) % DONE_Q_SIZE; |
317 |
+ } |
318 |
++ |
319 |
++ if (*quota == 0) { /* out of rx quota */ |
320 |
++ retcode = 1; |
321 |
++ goto out; |
322 |
++ } |
323 |
+ writew(np->rx_done, np->base + CompletionQConsumerIdx); |
324 |
+ |
325 |
+ out: |
326 |
+diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c |
327 |
+index 78b1a7a..67da11b 100644 |
328 |
+--- a/drivers/net/wireless/iwlwifi/iwl-tx.c |
329 |
++++ b/drivers/net/wireless/iwlwifi/iwl-tx.c |
330 |
+@@ -1192,10 +1192,9 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) |
331 |
+ /* If a Tx command is being handled and it isn't in the actual |
332 |
+ * command queue then there a command routing bug has been introduced |
333 |
+ * in the queue management code. */ |
334 |
+- if (txq_id != IWL_CMD_QUEUE_NUM) |
335 |
+- IWL_ERROR("Error wrong command queue %d command id 0x%X\n", |
336 |
+- txq_id, pkt->hdr.cmd); |
337 |
+- BUG_ON(txq_id != IWL_CMD_QUEUE_NUM); |
338 |
++ if (WARN(txq_id != IWL_CMD_QUEUE_NUM, |
339 |
++ "wrong command queue %d, command id 0x%X\n", txq_id, pkt->hdr.cmd)) |
340 |
++ return; |
341 |
+ |
342 |
+ cmd_index = get_cmd_index(&priv->txq[IWL_CMD_QUEUE_NUM].q, index, huge); |
343 |
+ cmd = priv->txq[IWL_CMD_QUEUE_NUM].cmd[cmd_index]; |
344 |
+diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c |
345 |
+index 9aa301c..f90fbcd 100644 |
346 |
+--- a/drivers/scsi/aacraid/linit.c |
347 |
++++ b/drivers/scsi/aacraid/linit.c |
348 |
+@@ -175,8 +175,8 @@ static struct aac_driver_ident aac_drivers[] = { |
349 |
+ { aac_rx_init, "percraid", "DELL ", "PERCRAID ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Boxster/PERC3DiB) */ |
350 |
+ { aac_rx_init, "aacraid", "ADAPTEC ", "catapult ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* catapult */ |
351 |
+ { aac_rx_init, "aacraid", "ADAPTEC ", "tomcat ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* tomcat */ |
352 |
+- { aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2120S ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2120S (Crusader) */ |
353 |
+- { aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2200S ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2200S (Vulcan) */ |
354 |
++ { aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2120S ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Adaptec 2120S (Crusader) */ |
355 |
++ { aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2200S ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Adaptec 2200S (Vulcan) */ |
356 |
+ { aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2200S ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2200S (Vulcan-2m) */ |
357 |
+ { aac_rx_init, "aacraid", "Legend ", "Legend S220 ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S220 (Legend Crusader) */ |
358 |
+ { aac_rx_init, "aacraid", "Legend ", "Legend S230 ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S230 (Legend Vulcan) */ |
359 |
+diff --git a/drivers/scsi/ibmvscsi/ibmvstgt.c b/drivers/scsi/ibmvscsi/ibmvstgt.c |
360 |
+index 2a5b29d..e2dd6a4 100644 |
361 |
+--- a/drivers/scsi/ibmvscsi/ibmvstgt.c |
362 |
++++ b/drivers/scsi/ibmvscsi/ibmvstgt.c |
363 |
+@@ -864,21 +864,23 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) |
364 |
+ |
365 |
+ INIT_WORK(&vport->crq_work, handle_crq); |
366 |
+ |
367 |
+- err = crq_queue_create(&vport->crq_queue, target); |
368 |
++ err = scsi_add_host(shost, target->dev); |
369 |
+ if (err) |
370 |
+ goto free_srp_target; |
371 |
+ |
372 |
+- err = scsi_add_host(shost, target->dev); |
373 |
++ err = scsi_tgt_alloc_queue(shost); |
374 |
+ if (err) |
375 |
+- goto destroy_queue; |
376 |
++ goto remove_host; |
377 |
+ |
378 |
+- err = scsi_tgt_alloc_queue(shost); |
379 |
++ err = crq_queue_create(&vport->crq_queue, target); |
380 |
+ if (err) |
381 |
+- goto destroy_queue; |
382 |
++ goto free_queue; |
383 |
+ |
384 |
+ return 0; |
385 |
+-destroy_queue: |
386 |
+- crq_queue_destroy(target); |
387 |
++free_queue: |
388 |
++ scsi_tgt_free_queue(shost); |
389 |
++remove_host: |
390 |
++ scsi_remove_host(shost); |
391 |
+ free_srp_target: |
392 |
+ srp_target_free(target); |
393 |
+ put_host: |
394 |
+diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c |
395 |
+index 428b599..3a8bb53 100644 |
396 |
+--- a/drivers/usb/gadget/f_rndis.c |
397 |
++++ b/drivers/usb/gadget/f_rndis.c |
398 |
+@@ -651,6 +651,8 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) |
399 |
+ fs_in_desc.bEndpointAddress; |
400 |
+ hs_out_desc.bEndpointAddress = |
401 |
+ fs_out_desc.bEndpointAddress; |
402 |
++ hs_notify_desc.bEndpointAddress = |
403 |
++ fs_notify_desc.bEndpointAddress; |
404 |
+ |
405 |
+ /* copy descriptors, and track endpoint copies */ |
406 |
+ f->hs_descriptors = usb_copy_descriptors(eth_hs_function); |
407 |
+@@ -662,6 +664,8 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) |
408 |
+ f->hs_descriptors, &hs_in_desc); |
409 |
+ rndis->hs.out = usb_find_endpoint(eth_hs_function, |
410 |
+ f->hs_descriptors, &hs_out_desc); |
411 |
++ rndis->hs.notify = usb_find_endpoint(eth_hs_function, |
412 |
++ f->hs_descriptors, &hs_notify_desc); |
413 |
+ } |
414 |
+ |
415 |
+ rndis->port.open = rndis_open; |
416 |
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
417 |
+index e61f2bf..e16d547 100644 |
418 |
+--- a/drivers/usb/storage/unusual_devs.h |
419 |
++++ b/drivers/usb/storage/unusual_devs.h |
420 |
+@@ -168,7 +168,7 @@ UNUSUAL_DEV( 0x0421, 0x005d, 0x0001, 0x0600, |
421 |
+ US_FL_FIX_CAPACITY ), |
422 |
+ |
423 |
+ /* Patch for Nokia 5310 capacity */ |
424 |
+-UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591, |
425 |
++UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0701, |
426 |
+ "Nokia", |
427 |
+ "5310", |
428 |
+ US_SC_DEVICE, US_PR_DEVICE, NULL, |
429 |
+@@ -253,6 +253,20 @@ UNUSUAL_DEV( 0x0421, 0x04fa, 0x0550, 0x0660, |
430 |
+ US_SC_DEVICE, US_PR_DEVICE, NULL, |
431 |
+ US_FL_FIX_CAPACITY ), |
432 |
+ |
433 |
++/* Reported by Ozan Sener <themgzzy@×××××.com> */ |
434 |
++UNUSUAL_DEV( 0x0421, 0x0060, 0x0551, 0x0551, |
435 |
++ "Nokia", |
436 |
++ "3500c", |
437 |
++ US_SC_DEVICE, US_PR_DEVICE, NULL, |
438 |
++ US_FL_FIX_CAPACITY ), |
439 |
++ |
440 |
++/* Reported by CSECSY Laszlo <boobaa@××××××××××.org> */ |
441 |
++UNUSUAL_DEV( 0x0421, 0x0063, 0x0001, 0x0601, |
442 |
++ "Nokia", |
443 |
++ "Nokia 3109c", |
444 |
++ US_SC_DEVICE, US_PR_DEVICE, NULL, |
445 |
++ US_FL_FIX_CAPACITY ), |
446 |
++ |
447 |
+ /* Patch for Nokia 5310 capacity */ |
448 |
+ UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591, |
449 |
+ "Nokia", |
450 |
+diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h |
451 |
+index b72ec66..1f6fd4f 100644 |
452 |
+--- a/include/asm-parisc/tlbflush.h |
453 |
++++ b/include/asm-parisc/tlbflush.h |
454 |
+@@ -44,9 +44,12 @@ static inline void flush_tlb_mm(struct mm_struct *mm) |
455 |
+ { |
456 |
+ BUG_ON(mm == &init_mm); /* Should never happen */ |
457 |
+ |
458 |
+-#ifdef CONFIG_SMP |
459 |
++#if 1 || defined(CONFIG_SMP) |
460 |
+ flush_tlb_all(); |
461 |
+ #else |
462 |
++ /* FIXME: currently broken, causing space id and protection ids |
463 |
++ * to go out of sync, resulting in faults on userspace accesses. |
464 |
++ */ |
465 |
+ if (mm) { |
466 |
+ if (mm->context != 0) |
467 |
+ free_sid(mm->context); |
468 |
+diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
469 |
+index 1d96aed..fdef553 100644 |
470 |
+--- a/sound/pci/hda/patch_sigmatel.c |
471 |
++++ b/sound/pci/hda/patch_sigmatel.c |
472 |
+@@ -638,6 +638,7 @@ static struct hda_verb stac92hd71bxx_core_init[] = { |
473 |
+ { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
474 |
+ { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
475 |
+ { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, |
476 |
++ {} |
477 |
+ }; |
478 |
+ |
479 |
+ #define HD_DISABLE_PORTF 3 |
480 |
+diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c |
481 |
+index 690bfea..5e023ba 100644 |
482 |
+--- a/sound/soc/omap/omap-pcm.c |
483 |
++++ b/sound/soc/omap/omap-pcm.c |
484 |
+@@ -231,7 +231,7 @@ static int omap_pcm_open(struct snd_pcm_substream *substream) |
485 |
+ if (ret < 0) |
486 |
+ goto out; |
487 |
+ |
488 |
+- prtd = kzalloc(sizeof(prtd), GFP_KERNEL); |
489 |
++ prtd = kzalloc(sizeof(*prtd), GFP_KERNEL); |
490 |
+ if (prtd == NULL) { |
491 |
+ ret = -ENOMEM; |
492 |
+ goto out; |