aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/isdn/hisax/s0box.c
diff options
context:
space:
mode:
authorNamhoon Kim <namhoonk@cs.unc.edu>2017-05-01 14:13:05 -0400
committerNamhoon Kim <namhoonk@cs.unc.edu>2017-05-01 14:13:05 -0400
commitd97c84a58867f481fede002fbd1510fc51b34e9e (patch)
treee38052cab5dc4fb81207e979d56e53aeb55029c1 /drivers/isdn/hisax/s0box.c
parentb388244876da9dbb2b7449bcc467fe4378ce1009 (diff)
RTSS 2017 submissionwip-modechange
Diffstat (limited to 'drivers/isdn/hisax/s0box.c')
0 files changed, 0 insertions, 0 deletions
[MTD] mtdoops: Perform write operations in a workqueue' href='/cgit/cgit.cgi/litmus-rt-budgetable-locks.git/.git/commit/drivers/mtd/mtdoops.c?h=update_litmus_2019&id=6ce0a856c10c8ab8568764436864616efa88e908'>6ce0a856c10c
4b23aff08364



be95745f0167
4b23aff08364

4b23aff08364

be95745f0167














4b23aff08364





be95745f0167
4b23aff08364
be95745f0167

9507b0c838e3

4b23aff08364



be95745f0167
4b23aff08364




79dcd8e9e1f2
4b23aff08364




7e1f0dc0551b
4b23aff08364


a15b124fc4f1

2e386e4bac90
4b23aff08364





be95745f0167



4b23aff08364


6ce0a856c10c
4b23aff08364
4b23aff08364
ecd5b3102322
4b23aff08364




be95745f0167
6ce0a856c10c


4b23aff08364
a15b124fc4f1

4b23aff08364

6ce0a856c10c

4b23aff08364
6ce0a856c10c

4b23aff08364






9507b0c838e3
4b23aff08364
9507b0c838e3
ecd5b3102322
4b23aff08364


8f461a730242
7086c19d0742
2986bd2a330e


a15b124fc4f1
2986bd2a330e

4b23aff08364
9507b0c838e3

4b23aff08364
9507b0c838e3
ecd5b3102322
4b23aff08364
9507b0c838e3
a15b124fc4f1
4b23aff08364




9507b0c838e3
4b23aff08364
2986bd2a330e
a15b124fc4f1

2986bd2a330e
4b23aff08364

800ffd349698
5942ddbc500d
2986bd2a330e
a15b124fc4f1
2986bd2a330e



4b23aff08364

621e4f8e9b20
4b23aff08364
6ce0a856c10c

2e386e4bac90
6ce0a856c10c
4b23aff08364
2e386e4bac90



6ce0a856c10c
016c1291ce70
7ae79d7ff176

016c1291ce70




eda95cbf7519

6ce0a856c10c
9507b0c838e3


be95745f0167
2e386e4bac90
6ce0a856c10c

621e4f8e9b20

621e4f8e9b20





a15b124fc4f1
4b23aff08364
6ce0a856c10c
4b23aff08364

2986bd2a330e
f0482ee3669a
4b23aff08364


8f461a730242
7086c19d0742
3538c5632993
be95745f0167

329ad399a9b3

2e386e4bac90
d57f40544a41
2e386e4bac90


2986bd2a330e


be95745f0167

f0482ee3669a
4b23aff08364

f0482ee3669a
4b23aff08364
a15b124fc4f1
f0482ee3669a
4b23aff08364
a15b124fc4f1
f0482ee3669a
4b23aff08364
a15b124fc4f1

f0482ee3669a
4b23aff08364





43b5693d4041
6ce0a856c10c
4b23aff08364




6ce0a856c10c
4b23aff08364

2e386e4bac90









fc2d557c74dc
a3dd3323058d
fc2d557c74dc

2e386e4bac90














016c1291ce70

2e386e4bac90



4b23aff08364



2e386e4bac90

4b23aff08364
2e386e4bac90
e2a0f25b4f52

a15b124fc4f1
4b23aff08364

a15b124fc4f1


4b23aff08364

9507b0c838e3
a15b124fc4f1

79dcd8e9e1f2

1114e3d00f53





be95745f0167

556f063580db
be95745f0167
2e386e4bac90









be95745f0167

4b23aff08364
1114e3d00f53
9507b0c838e3
6ce0a856c10c
79dcd8e9e1f2
4b23aff08364





a15b124fc4f1
4b23aff08364

2e386e4bac90


4b23aff08364
75c52a49630a

4b23aff08364

4b23aff08364





2e386e4bac90
4b23aff08364

2e386e4bac90

4b23aff08364
2e386e4bac90



9507b0c838e3







2e386e4bac90

4b23aff08364
2e386e4bac90


2e386e4bac90
9507b0c838e3
4b23aff08364
a15b124fc4f1
4b23aff08364

2e386e4bac90
4b23aff08364
6ce0a856c10c

4b23aff08364
4b23aff08364



2e386e4bac90
4b23aff08364



4b23aff08364
be95745f0167
4b23aff08364


2e386e4bac90

4b23aff08364



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469


                        
                                                            

























                                                                      
                        
                            
                          
                            
 


                                              
                                        
                               




                                                                          
 









                                                                              
                               

                                
                      

                                      



                             
                                      

                       

           














                                                                   





                                                                    
                                                                       
 

                                                                            

                                                         



                                         
                 




                                                
                                   




                                              
                                     


                                                  

                                                                                                   
                                                              





                                                    



                                                                        


                 
                                                            
 
                        
                                             




                                         
                                               


                                                
 

                                                               

 

                                                                    
 

                                                                               






                                        
                                                             
                       
                                                                                       
                                                     


                                          
                                      
                                                                        


                              
                                                                                   

                               
         

                                                                    
                    
                                                                               
                                                     
                                          
                                                                            
                                                                      




                                                        
                                                                            
 
                       

                                                            
                       

         
                                                  
                                                                          
                              
                                                                                     



                               

 
                                                                 
 

                                        
                 
                
 



                                              
 
                    

                                                                           




                                                                                                  

                                                                     
 


                                                                                                 
                                           
                                                 

                                 

 





                                                                               
 
 
                                                           

                                        
                                  
                                            


                                                        
                                           
                                                             
                                 

                                             

                                                                            
                                                    
                                                                    


                                                                                                  


                                 

                                                                     
                                           

                                             
                                            
                                      
                                                                            
                                            
                                      
                                                                          
                                            
                                      

                                                                       
                                            





                                      
                                                
                       




                                  
                                 

 









                                                                               
                                       
                                      

                       














                                                                        

                                      



                                                                 



                                                    

                                                            
 
                                       

                                            
                                                               

                       


                                                                                         

                       
                                           

                                                                                           

                       





                                                                                  

                                                                 
                                                                
                                   









                                                                                            

                       
 
                       
                                                       
                                
                                                                             





                                                       
                                                               

                       


                                                                                   
                        

                                          

 





                                               
                                    

                                                

                      
 



                                                                                               







                                                                                     

                                         
                            


                                                     
 
                                             
                             
                                                                                  

                               
                                                 
 

                                                            
 



                                             
                                     



                                                
                             
                                   


 

                          



                                                           
/*
 * MTD Oops/Panic logger
 *
 * Copyright © 2007 Nokia Corporation. All rights reserved.
 *
 * Author: Richard Purdie <rpurdie@openedhand.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/console.h>
#include <linux/vmalloc.h>
#include <linux/workqueue.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/mtd/mtd.h>
#include <linux/kmsg_dump.h>

/* Maximum MTD partition size */
#define MTDOOPS_MAX_MTD_SIZE (8 * 1024 * 1024)

#define MTDOOPS_KERNMSG_MAGIC 0x5d005d00
#define MTDOOPS_HEADER_SIZE   8

static unsigned long record_size = 4096;
module_param(record_size, ulong, 0400);
MODULE_PARM_DESC(record_size,
		"record size for MTD OOPS pages in bytes (default 4096)");

static char mtddev[80];
module_param_string(mtddev, mtddev, 80, 0400);
MODULE_PARM_DESC(mtddev,
		"name or index number of the MTD device to use");

static int dump_oops = 1;
module_param(dump_oops, int, 0600);
MODULE_PARM_DESC(dump_oops,
		"set to 1 to dump oopses, 0 to only dump panics (default 1)");

static struct mtdoops_context {
	struct kmsg_dumper dump;

	int mtd_index;
	struct work_struct work_erase;
	struct work_struct work_write;
	struct mtd_info *mtd;
	int oops_pages;
	int nextpage;
	int nextcount;
	unsigned long *oops_page_used;

	void *oops_buf;
} oops_cxt;

static void mark_page_used(struct mtdoops_context *cxt, int page)
{
	set_bit(page, cxt->oops_page_used);
}

static void mark_page_unused(struct mtdoops_context *cxt, int page)
{
	clear_bit(page, cxt->oops_page_used);
}

static int page_is_used(struct mtdoops_context *cxt, int page)
{
	return test_bit(page, cxt->oops_page_used);
}

static void mtdoops_erase_callback(struct erase_info *done)
{
	wait_queue_head_t *wait_q = (wait_queue_head_t *)done->priv;
	wake_up(wait_q);
}

static int mtdoops_erase_block(struct mtdoops_context *cxt, int offset)
{
	struct mtd_info *mtd = cxt->mtd;
	u32 start_page_offset = mtd_div_by_eb(offset, mtd) * mtd->erasesize;
	u32 start_page = start_page_offset / record_size;
	u32 erase_pages = mtd->erasesize / record_size;
	struct erase_info erase;
	DECLARE_WAITQUEUE(wait, current);
	wait_queue_head_t wait_q;
	int ret;
	int page;

	init_waitqueue_head(&wait_q);
	erase.mtd = mtd;
	erase.callback = mtdoops_erase_callback;
	erase.addr = offset;
	erase.len = mtd->erasesize;
	erase.priv = (u_long)&wait_q;

	set_current_state(TASK_INTERRUPTIBLE);
	add_wait_queue(&wait_q, &wait);

	ret = mtd_erase(mtd, &erase);
	if (ret) {
		set_current_state(TASK_RUNNING);
		remove_wait_queue(&wait_q, &wait);
		printk(KERN_WARNING "mtdoops: erase of region [0x%llx, 0x%llx] on \"%s\" failed\n",
		       (unsigned long long)erase.addr,
		       (unsigned long long)erase.len, mtddev);
		return ret;
	}

	schedule();  /* Wait for erase to finish. */
	remove_wait_queue(&wait_q, &wait);

	/* Mark pages as unused */
	for (page = start_page; page < start_page + erase_pages; page++)
		mark_page_unused(cxt, page);

	return 0;
}

static void mtdoops_inc_counter(struct mtdoops_context *cxt)
{
	cxt->nextpage++;
	if (cxt->nextpage >= cxt->oops_pages)
		cxt->nextpage = 0;
	cxt->nextcount++;
	if (cxt->nextcount == 0xffffffff)
		cxt->nextcount = 0;

	if (page_is_used(cxt, cxt->nextpage)) {
		schedule_work(&cxt->work_erase);
		return;
	}

	printk(KERN_DEBUG "mtdoops: ready %d, %d (no erase)\n",
	       cxt->nextpage, cxt->nextcount);
}

/* Scheduled work - when we can't proceed without erasing a block */
static void mtdoops_workfunc_erase(struct work_struct *work)
{
	struct mtdoops_context *cxt =
			container_of(work, struct mtdoops_context, work_erase);
	struct mtd_info *mtd = cxt->mtd;
	int i = 0, j, ret, mod;

	/* We were unregistered */
	if (!mtd)
		return;

	mod = (cxt->nextpage * record_size) % mtd->erasesize;
	if (mod != 0) {
		cxt->nextpage = cxt->nextpage + ((mtd->erasesize - mod) / record_size);
		if (cxt->nextpage >= cxt->oops_pages)
			cxt->nextpage = 0;
	}

	while (mtd_can_have_bb(mtd)) {
		ret = mtd_block_isbad(mtd, cxt->nextpage * record_size);
		if (!ret)
			break;
		if (ret < 0) {
			printk(KERN_ERR "mtdoops: block_isbad failed, aborting\n");
			return;
		}
badblock:
		printk(KERN_WARNING "mtdoops: bad block at %08lx\n",
		       cxt->nextpage * record_size);
		i++;
		cxt->nextpage = cxt->nextpage + (mtd->erasesize / record_size);
		if (cxt->nextpage >= cxt->oops_pages)
			cxt->nextpage = 0;
		if (i == cxt->oops_pages / (mtd->erasesize / record_size)) {
			printk(KERN_ERR "mtdoops: all blocks bad!\n");
			return;
		}
	}

	for (j = 0, ret = -1; (j < 3) && (ret < 0); j++)
		ret = mtdoops_erase_block(cxt, cxt->nextpage * record_size);

	if (ret >= 0) {
		printk(KERN_DEBUG "mtdoops: ready %d, %d\n",
		       cxt->nextpage, cxt->nextcount);
		return;
	}

	if (mtd_can_have_bb(mtd) && ret == -EIO) {
		ret = mtd_block_markbad(mtd, cxt->nextpage * record_size);
		if (ret < 0) {
			printk(KERN_ERR "mtdoops: block_markbad failed, aborting\n");
			return;
		}
	}
	goto badblock;
}

static void mtdoops_write(struct mtdoops_context *cxt, int panic)
{
	struct mtd_info *mtd = cxt->mtd;
	size_t retlen;
	u32 *hdr;
	int ret;

	/* Add mtdoops header to the buffer */
	hdr = cxt->oops_buf;
	hdr[0] = cxt->nextcount;
	hdr[1] = MTDOOPS_KERNMSG_MAGIC;

	if (panic) {
		ret = mtd_panic_write(mtd, cxt->nextpage * record_size,
				      record_size, &retlen, cxt->oops_buf);
		if (ret == -EOPNOTSUPP) {
			printk(KERN_ERR "mtdoops: Cannot write from panic without panic_write\n");
			return;
		}
	} else
		ret = mtd_write(mtd, cxt->nextpage * record_size,
				record_size, &retlen, cxt->oops_buf);