aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/parser.h
blob: ea2281e726f65f5f2968eb571adc874843530959 (plain) (blame)
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
/*
 * linux/include/linux/parser.h
 *
 * Header for lib/parser.c
 * Intended use of these functions is parsing filesystem argument lists,
 * but could potentially be used anywhere else that simple option=arg
 * parsing is required.
 */


/* associates an integer enumerator with a pattern string. */
struct match_token {
	int token;
	const char *pattern;
};

typedef struct match_token match_table_t[];

/* Maximum number of arguments that match_token will find in a pattern */
enum {MAX_OPT_ARGS = 3};

/* Describe the location within a string of a substring */
typedef struct {
	char *from;
	char *to;
} substring_t;

int match_token(char *, const match_table_t table, substring_t args[]);
int match_int(substring_t *, int *result);
int match_octal(substring_t *, int *result);
int match_hex(substring_t *, int *result);
size_t match_strlcpy(char *, const substring_t *, size_t);
char *match_strdup(const substring_t *);
de> 2007-03-09 16:02:34 -0500 firewire: Add SBP-2 protocol driver for storage devices.' href='/cgit/cgit.cgi/litmus-rt-tegra.git/commit/drivers/firewire/fw-sbp2.c?id=9ba136d0fe5a3dd33533b4a2a21156aa22f80ebe'>9ba136d0fe5
5cd54c94b0b











2df222b8f8f


















9220f194620


ffcaade3109




2df222b8f8f








9220f194620

ffcaade3109
2df222b8f8f








9220f194620
ffcaade3109

2df222b8f8f


9ba136d0fe5
a98e2719877
9ba136d0fe5


5a3c2be6c9a






9ba136d0fe5

5a3c2be6c9a
9ba136d0fe5
5a3c2be6c9a
9ba136d0fe5

c781c06d119
5a3c2be6c9a



c781c06d119
9ba136d0fe5
7f37c426c68

f8436158b1d
2e2705bdcb9
9ba136d0fe5

5a3c2be6c9a






48f18c761c0
05cca738142
5a3c2be6c9a

c9755e14a01
5a3c2be6c9a


05cca738142
384170da938
a08e100aece
2e2705bdcb9


5a3c2be6c9a

e5110d011e0




cd1f70fdb48


eaf76e0d027
9ba136d0fe5
17cff9ff871

9ba136d0fe5
09b12dd4e3c
af2719415a5





09b12dd4e3c





9ba136d0fe5
384170da938
5a3c2be6c9a


9ba136d0fe5
9ba136d0fe5























a77754a75d5







9ba136d0fe5







71ee9f01f2b

9ba136d0fe5



e57d2011a62
9ba136d0fe5


a98e2719877
9ba136d0fe5


a77754a75d5


5cd54c94b0b
a77754a75d5

9ba136d0fe5
a77754a75d5

9ba136d0fe5





71ee9f01f2b

9ba136d0fe5







9ba136d0fe5
71ee9f01f2b
9ba136d0fe5
71ee9f01f2b
9ba136d0fe5
a77754a75d5




0d7dcbf2a3b
a77754a75d5

9ba136d0fe5





71ee9f01f2b
af2719415a5
9ba136d0fe5


5a3c2be6c9a
9ba136d0fe5
9fb2dd12c01
9ba136d0fe5
9ba136d0fe5

f746072abc1


9ba136d0fe5





f746072abc1
9ba136d0fe5



05cca738142
9ba136d0fe5




ffcaade3109

9ba136d0fe5
9220f194620


3c5f80357c3
9220f194620
9ba136d0fe5

f746072abc1
9ba136d0fe5

ffcaade3109

f746072abc1
ffcaade3109

9ba136d0fe5

f746072abc1
9ba136d0fe5

2aa9ff7fc5b

f746072abc1
2aa9ff7fc5b

c781c06d119
c8c4707cf7c

c781c06d119
c8c4707cf7c






9ba136d0fe5





031bb27c4bf




9ba136d0fe5









53dca51175c
e57d2011a62





53dca51175c




9ba136d0fe5
5a3c2be6c9a
9ba136d0fe5

9ba136d0fe5


094614fc149
9ba136d0fe5



094614fc149





a77754a75d5
9ba136d0fe5






5a3c2be6c9a
a77754a75d5
e57d2011a62

9ba136d0fe5





baed6b82d9f
9ba136d0fe5
baed6b82d9f

9ba136d0fe5
baed6b82d9f
e57d2011a62
9ba136d0fe5


53dca51175c

9ba136d0fe5



e57d2011a62













9ba136d0fe5
1b34e974413
9ba136d0fe5
1b34e974413

9ba136d0fe5
e57d2011a62
e57d2011a62
9ba136d0fe5

53dca51175c

9ba136d0fe5
e5110d011e0
9ba136d0fe5


71ee9f01f2b
9ba136d0fe5

5a3c2be6c9a
9ba136d0fe5

e57d2011a62



9ba136d0fe5
f1397490017
2d826cc5c79
9ba136d0fe5


5a3c2be6c9a
9ba136d0fe5
e5110d011e0
9ba136d0fe5


2aaad97be6b
9ba136d0fe5


5a3c2be6c9a
9ba136d0fe5


2aaad97be6b
730c32f58ba


9ba136d0fe5


9ba136d0fe5
2aaad97be6b
1d3d52c5367

53dca51175c

9ba136d0fe5

6f061487f7d
9ba136d0fe5

2d826cc5c79
9ba136d0fe5


53dca51175c


9ba136d0fe5
e5110d011e0
9ba136d0fe5
a4c379c1979
9ba136d0fe5

be6f48b0174


2d826cc5c79
9ba136d0fe5


e57d2011a62
9ba136d0fe5

2d826cc5c79
8d8bb39b9eb
7aa484815f8
9ba136d0fe5
71ee9f01f2b

9ba136d0fe5
71ee9f01f2b
a77754a75d5

71ee9f01f2b


9ba136d0fe5
71ee9f01f2b



9ba136d0fe5
9ba136d0fe5
14dc992aa78
71ee9f01f2b
14dc992aa78
71ee9f01f2b
384170da938
a4c379c1979

9ba136d0fe5

9ba136d0fe5

2aaad97be6b
7aa484815f8


8d8bb39b9eb
7aa484815f8

5a3c2be6c9a

9ba136d0fe5
a4c379c1979
9ba136d0fe5
9ba136d0fe5
5a3c2be6c9a
48f18c761c0

9ba136d0fe5


2aaad97be6b
48f18c761c0

9ba136d0fe5


a77754a75d5

48f18c761c0
a77754a75d5

9ba136d0fe5





2d826cc5c79
7aa484815f8
9ba136d0fe5
2d826cc5c79
7aa484815f8
9ba136d0fe5
71ee9f01f2b
e57d2011a62
9ba136d0fe5



e0e60215552

e5110d011e0
1e119fa9950
9ba136d0fe5
1e119fa9950



9ba136d0fe5

53dca51175c

e0e60215552




9ba136d0fe5
e5110d011e0
9ba136d0fe5
1e119fa9950
9ba136d0fe5
e0e60215552
9ba136d0fe5
e0e60215552
9ba136d0fe5

5a3c2be6c9a

1e119fa9950
9ba136d0fe5

2e2705bdcb9
























e5110d011e0
2e2705bdcb9







a5fd9ec7a29
2e2705bdcb9
2e2705bdcb9












e5110d011e0
2e2705bdcb9











a5fd9ec7a29
2e2705bdcb9
2e2705bdcb9









e5110d011e0
2e2705bdcb9










f8436158b1d










5a3c2be6c9a
b3d6e151142
5a3c2be6c9a



f8436158b1d
e5110d011e0
5a3c2be6c9a
2e2705bdcb9


5a3c2be6c9a
f8436158b1d



33f1c6c3529
cd1f70fdb48













5a3c2be6c9a




f32ddaddf95
5a3c2be6c9a
1dc3bea78b6
5a3c2be6c9a
855c603d61e
b3d6e151142

df8ec2490fe

cd1f70fdb48




285838eb22e





cd1f70fdb48


285838eb22e

17cff9ff871















51f9dbef5be

e5110d011e0
1e119fa9950
51f9dbef5be
1e119fa9950



51f9dbef5be

5a3c2be6c9a

7f37c426c68

5a3c2be6c9a

48f18c761c0
e5110d011e0
48f18c761c0
5a3c2be6c9a
7f37c426c68
5a3c2be6c9a
7f37c426c68
be6f48b0174


5a8a1bcd15d
621f6dd7152
5a8a1bcd15d

7f37c426c68
ce896d95cc7
f8436158b1d
ce896d95cc7


5a3c2be6c9a

2e2705bdcb9
285838eb22e
2e2705bdcb9
48f18c761c0

2e2705bdcb9


285838eb22e
7f37c426c68

48f18c761c0

621f6dd7152

7f37c426c68
5a3c2be6c9a
71ee9f01f2b


7f37c426c68
48f18c761c0

7f37c426c68
51f9dbef5be

7f37c426c68
5a3c2be6c9a


0fa6dfdb0a2
f8436158b1d
0fa6dfdb0a2
2e2705bdcb9
0fa6dfdb0a2


9220f194620


48f18c761c0
f8436158b1d
e80de3704ac






1b9c12ba2fd
e80de3704ac



e80de3704ac



33f1c6c3529
e80de3704ac
7f37c426c68
e80de3704ac

f8436158b1d

2e2705bdcb9
e80de3704ac













285838eb22e
48f18c761c0
7f37c426c68
9ba136d0fe5
5a3c2be6c9a
9ba136d0fe5
5a3c2be6c9a
9ba136d0fe5
5a3c2be6c9a


9ba136d0fe5
5a3c2be6c9a


9ba136d0fe5
5a3c2be6c9a




9ba136d0fe5
f8436158b1d

cd1f70fdb48
f8436158b1d


2e2705bdcb9
5a3c2be6c9a

9ba136d0fe5
5a3c2be6c9a


ad85274fb7f
5a3c2be6c9a



9ba136d0fe5
5a3c2be6c9a














9ba136d0fe5

5a3c2be6c9a
9ba136d0fe5
5a3c2be6c9a

9ba136d0fe5
5a3c2be6c9a


9ba136d0fe5
5a3c2be6c9a
9ba136d0fe5
5a3c2be6c9a






384170da938

eaf76e0d027
384170da938

5a3c2be6c9a





0e3e2eabf4f

5a3c2be6c9a
9ba136d0fe5


5a3c2be6c9a


eaf76e0d027















5a3c2be6c9a



05cca738142
2df222b8f8f



48f18c761c0
5a3c2be6c9a
2df222b8f8f

9ba136d0fe5

5a3c2be6c9a
9ba136d0fe5


5a3c2be6c9a
9ba136d0fe5
f746072abc1
9ba136d0fe5
5a3c2be6c9a
2df222b8f8f
9ba136d0fe5

2df222b8f8f

5a3c2be6c9a
9ba136d0fe5
48f18c761c0
2df222b8f8f
5a3c2be6c9a






e5110d011e0
5a3c2be6c9a




09b12dd4e3c



5a3c2be6c9a




d961450da5e
5a3c2be6c9a


a1f64819fe9
c9755e14a01
5a3c2be6c9a



af2719415a5

5a3c2be6c9a


855c603d61e
1dc3bea78b6
855c603d61e
5a3c2be6c9a



f746072abc1


5a3c2be6c9a



eaf76e0d027
5a3c2be6c9a
9ba136d0fe5
a08e100aece








285838eb22e
5a3c2be6c9a
0dcfeb7e3c8
9ba136d0fe5
ad85274fb7f
5a3c2be6c9a
285838eb22e
5a3c2be6c9a




9ba136d0fe5




d961450da5e
9ba136d0fe5
285838eb22e
9ba136d0fe5




5a3c2be6c9a

48f18c761c0
e5110d011e0
9ba136d0fe5

be6f48b0174


5a8a1bcd15d
621f6dd7152
5a8a1bcd15d

9ba136d0fe5
5a3c2be6c9a
7f37c426c68
5a3c2be6c9a
ce896d95cc7









48f18c761c0
5a3c2be6c9a

7f37c426c68
285838eb22e

7f37c426c68
9ba136d0fe5
48f18c761c0

621f6dd7152

7f37c426c68
48f18c761c0

5a3c2be6c9a


2e2705bdcb9
285838eb22e
48f18c761c0
9ba136d0fe5



d961450da5e
5a3c2be6c9a
9ba136d0fe5
e5110d011e0
5a3c2be6c9a





2e2705bdcb9
5a3c2be6c9a
285838eb22e
5a3c2be6c9a
9ba136d0fe5




b3b2988841a
9ba136d0fe5
b3b2988841a

9ba136d0fe5
5af4e5eab30
9ba136d0fe5















5e2125677fd












53dca51175c
9ba136d0fe5
fbb5423c1df

9ba136d0fe5
















fbb5423c1df
9ba136d0fe5
fbb5423c1df

9ba136d0fe5
9ba136d0fe5
fbb5423c1df
9ba136d0fe5

fbb5423c1df

9ba136d0fe5
fbb5423c1df
9ba136d0fe5


53dca51175c

9ba136d0fe5
6f061487f7d

e5110d011e0
9ba136d0fe5


a77754a75d5
e0e60215552
9ba136d0fe5
a77754a75d5
9ba136d0fe5
fbb5423c1df
9ba136d0fe5

fbb5423c1df
9ba136d0fe5



fbb5423c1df
9ba136d0fe5


a77754a75d5

9ba136d0fe5

c781c06d119

9ba136d0fe5
c781c06d119

fbb5423c1df
2e2705bdcb9
9ba136d0fe5


2d826cc5c79
5e2125677fd
9ba136d0fe5
fbb5423c1df
9ba136d0fe5
9ba136d0fe5

53dca51175c

9ba136d0fe5
09b12dd4e3c





95ffc5e314e
9ba136d0fe5
c781c06d119

9ba136d0fe5


c781c06d119

09b12dd4e3c
71ee9f01f2b





95ffc5e314e
9ba136d0fe5

09b12dd4e3c


9ba136d0fe5

b4be016ad81


8d8bb39b9eb
b4be016ad81
9ba136d0fe5
c781c06d119

9ba136d0fe5


c781c06d119

71ee9f01f2b


09b12dd4e3c
9ba136d0fe5
95ffc5e314e


09b12dd4e3c

95ffc5e314e

9ba136d0fe5

9ba136d0fe5



5a3c2be6c9a
e5110d011e0
9ba136d0fe5
4bbc1bdd010
9ba136d0fe5
c781c06d119



9ba136d0fe5
8a8cea27348
e1b68c4dcfb


9ba136d0fe5

2d826cc5c79
9ba136d0fe5

5a3c2be6c9a
9ba136d0fe5

12f26aa1b17

e57d2011a62
9ba136d0fe5
5a3c2be6c9a
9ba136d0fe5


a08e100aece
71ee9f01f2b
a08e100aece
f1397490017
71ee9f01f2b
9ba136d0fe5

0d7dcbf2a3b
9ba136d0fe5
4bbc1bdd010


5a3c2be6c9a

9ba136d0fe5
64a87b244b9
9ba136d0fe5

8526392ae81


5e2125677fd

5a3c2be6c9a
5e2125677fd
82eff9db7dc
4bbc1bdd010
5a3c2be6c9a


e57d2011a62
5a3c2be6c9a
9ba136d0fe5

cfb01381f4f

5a3c2be6c9a
cfb01381f4f
5513c5f6f9b



cfb01381f4f

8ac3a47cab3

465ff3185e0
5a3c2be6c9a
cfb01381f4f
5a3c2be6c9a
cfb01381f4f


9ba136d0fe5

5a3c2be6c9a
9ba136d0fe5
cfb01381f4f

2635f96f908


cfb01381f4f

5a3c2be6c9a
9ba136d0fe5
5a3c2be6c9a
9ba136d0fe5
5a3c2be6c9a

9ba136d0fe5
5a3c2be6c9a
ffcaade3109


5a3c2be6c9a
cf47c7a26ca
5a3c2be6c9a
09b12dd4e3c

9ba136d0fe5








5a3c2be6c9a
9ba136d0fe5
48f18c761c0
5a3c2be6c9a

9ba136d0fe5



14e2198646d






53dca51175c

14e2198646d

5a3c2be6c9a
14e2198646d


14e2198646d
5a3c2be6c9a
14e2198646d
c9755e14a01

5a3c2be6c9a
14e2198646d








9ba136d0fe5


b02b6bc4657
9ba136d0fe5
cfb01381f4f
9ba136d0fe5




02af8e70cbe

14e2198646d
9ba136d0fe5

9ba136d0fe5




1e4c7b0dabb




9ba136d0fe5

df8ec2490fe



9ba136d0fe5





df8ec2490fe
9ba136d0fe5



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
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663

                                   
  
                                                                  















                                                                          

                                                                         







                                                        
                         
                      
                             


                              
                           


                                     
                         

                       
                                  
                         
                              
                              

                           
                         
                            
                            

                          
                       


                           


                             











                                                                            


















                                                                               


                                                                           




                                                                          








                                                                          

                                            
                                            








                                                                             
                                                                            

                                                                              


                                                                                
                                                                           
                                                   


                                              






                                                                             

                                                  
 
                                        
                

                     
          



                                                                           
           
                       

                                 
                      
                     

  






                                                                
                           
                                 

                                     
                 


                         
                                 
                                     
                                 


                                                           

  




                                                               


                                                                           
                                                                           
                                                  

                                                                              
 
  





                                                                            





                                                                       
                         
                                            


                                            
 























                                               







                                                                   







                     

                    



                                
                         


                                    
                                                                             


                              


                                                           
                                                                   

                                                           
 

                                                           





                                             

                              







                                                
                            
                    
                                                
                              
  




                                                   
                                                   

                                                   





                                                    
                            
                                                    


                              
                                     
 
                                                                           
                                  

  


                                                                             





                                                                      
          



                              
                                 




                                                                      

                                                                          
          


                                                         
                                                                          
          

                                                                        
                                                                  

                                                                     

                                                     
                                                                  

                                                                          

                                                   
                                                                  

                                                                         

                                                                       
                                                                  

                                                                         
          

                                                                       
           






                                                                          





                                                                       




                                                                       









                                                                       
                                       





                                                                         




                                                                                
 
                                                     

                                  


                                                 
                                                    



                                                                  





                                                             
                                                                               






                                                                         
                                                       
                                                       

                                                                     





                                                   
                                          
                                            

                                               
                                                           
         
 


                                                        

                                                                          



                                    













                                                                      
                                     
                                                           
                                         

                                                           
         
 
                                       

 

                                                                             
 
                                                          


                              
                                                         

                                                      
                                                 

                                                           



                                                                           
                                                                         
                                                                       
                                                            


                                                   
                                                         
 
                                                          


                                    
                             


                                                      
                                               


                                                           
                           


                                                                      


                                             
 
                      

 

                                                               

                                         
                                                                         

                   
                                                              


                             


                                                                              
 
                                                          
                                        
                             

                             


                                                                             
                                                


                               
                                   

                                                                    
                                                                       
                                                                       
                                           
 

                                                                    
 
                                        

                                                   


                                                                       
 



                                                              
 
                                             
                                                                     
                                                 
                                                     
                                                                              
                                                   

                                           

         

                                                     
 


                                                                    
                                                                           

                                          

                                                          
 
                                                                           
 
                      
                                        

                                                                   


                         
                                                

                                                                       


                         

                                                      
                                                                      

                                                             





                                                                     
                                                              
                      
                                                                 
                                                                 
                       
                     
                                                                       
                                            



                      

                                                          
                                                          
                     
 



                                                                               

 

                                                                    




                                                                  
 
                                                          
                                 
                        
 
                                            
                      
                       

                                                                     

                                                                            
                                                                              

 
























                                                                              
                                                        







                                                                         
                                        
                                                   












                                                                      
                                                        











                                                                         
                    
                                             









                                                                      
                                                        










                                                                         










                                                             
                                                  
 



                                                                               
                                 
                                                      
 


                               
                                                                 



                                                                              
                 













                                                                          




                                                                     
                                                                               
 
                               
                             
                              

 

                                        




                                                    





                                                                              


                                                           

 















                                                                               

                                                               
                                                          
                                                                    
 



                                                                               

 

                                                     

                                                

                                                                        
                                          
                                                      
                                
                                 
                                            
                                               
 


                                          
                                           
                                                                      

                                              
 
                                                                              
                         


                                                                         

                                                                              
                                        
                                                                 
                        

                                                                     


                                                                   
                         

         

                                                

                                                                          
 
                                         


                                                                               
 

                                                             
 

                                                                     
 


                                                        
                                  
                           
                                     
                                               


                         


                                                                 
                                                                         
                                                                         






                                                                             
 



                                                       



                                                         
                                      
                                      
         

                                                 

                              
                             













                                                                          
     
                             
 
 
                                                                        
 
                                     
 


                                              
 


                                                                 
 




                                                                      
 

                                          
                                        


                             
                          

                                                 
 


                                                
 



                                                                              
 














                                                                      

                                                         
 
                                                     

                                                                      
                              


                                                  
                              
 
                               






                                                   

                                                                        
                                                                         

                              





                                                                  

                                                                                  
                                               


                              


                 















                                                                      



                                                                     
                                                



                                                                                
                                       
 

                                         

                                                                  
 


                                                                  
 
                                                               
                                                                               
                                 
 
                                                           

                      

              
                                                     
                                                                          
                                                                    
                             






                                                      
                                                          




                                     



                                                                           




                                                                     
                                            


                                      
                                              
                                                                             



                                                  

                                               


                                                    
                              
                          
 



                                                                       


                                                   



                                                            
                                               
                                                             
 








                                                                                
                                                                              
                                                    
                                                         
                 
 
              
                             




                             




                                            
                                                                 
 
                             




                                                    

                                                                        
                                          
                                                      

                                               


                                          
                                           
                                                                      

                                              
 
                                                             
                                                            
                                                               









                                                                             
                                                                           

                                                                    
                 

                                                         
         
 

                                                

                                                                          
 

                                                               


                             
                                       
     
                             



                                             
                                                                 
                                     
 
                                                          





                                                                  
                                             
                                
                                       
         




                                          
                                                          
         

                                                             
                                                        
                                                      















                                           












                                                                            
                                                                              
 

                       
















                                         
                                           
 

                             
                                      
                                    
                           

                                           

                                                 
                
                                       


         

                                                            
 

                                                                      
                                                               


                             
                                             
                                                          
 
                                                       
                                                  
                                              

                                                   
                                                    



                                                  
                                                 


                              

                                                                                    

                                                                                   

                                                                      
                                                                     

                                                           
                                            
                                                  


                                                                     
                                                              
                                                          
 
                                  
                            

 

                                                                       
 





                                                                         
                          
 

                                                                     


                                                                     

                  
                     





                                                                           
                         

         


                                                                            

         


                                                                       
                                                                         
                                     
 

                                                                    


                                                                     

                                                                      


                                                                               
                                                                   
 


                 

                                                                           

                       

 



                                                                             
                                                             
                                                          
                                     
                                                        
 



                                                                      
                                                          
                                                                                


                                              

         
                                                

                                                   
                                              

         

                                                               
                                   
 
                       


                         
                                                            
                                        
                                                               
                                                      
                                    

                                                      
                                                                        
 


                                                                           

                                                                            
 
                                                                    

                                                  


                                                                    

                                                                             
                         
         
 
                                                                   


                                                                          
                                            
                      

 

                                                          
                                                      
 



                                                                            

                                

                                                                   
 
                                                              
                                       
 


                 

                                                              
                                                      
 

                                


                                            

                                        
 
                                      
                                                                
                                         

                                                                
                                       
 


                                                                   
                                                                  
                                                                             
 

                                                                           








                                                                      
                                                             
 
                                                            

                             



                       






                                                                        

                                                                 

                                                       
                                     


                         
 
                            
 

                                                          
                                                        








                                                                            


                                                         
                                                   
                                                         
                                                        




                                                            

                                    
                                                        

  




                                                        




                                                                 

                                 



                                                                





                                                    
                                   



                          
/*
 * SBP2 driver (SCSI over IEEE1394)
 *
 * Copyright (C) 2005-2007  Kristian Hoegsberg <krh@bitplanet.net>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

/*
 * The basic structure of this driver is based on the old storage driver,
 * drivers/ieee1394/sbp2.c, originally written by
 *     James Goodwin <jamesg@filanet.com>
 * with later contributions and ongoing maintenance from
 *     Ben Collins <bcollins@debian.org>,
 *     Stefan Richter <stefanr@s5r6.in-berlin.de>
 * and many others.
 */

#include <linux/blkdev.h>
#include <linux/bug.h>
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/firewire.h>
#include <linux/firewire-constants.h>
#include <linux/init.h>
#include <linux/jiffies.h>
#include <linux/kernel.h>
#include <linux/kref.h>
#include <linux/list.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/scatterlist.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/string.h>
#include <linux/stringify.h>
#include <linux/workqueue.h>

#include <asm/byteorder.h>
#include <asm/system.h>

#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>

/*
 * So far only bridges from Oxford Semiconductor are known to support
 * concurrent logins. Depending on firmware, four or two concurrent logins
 * are possible on OXFW911 and newer Oxsemi bridges.
 *
 * Concurrent logins are useful together with cluster filesystems.
 */
static int sbp2_param_exclusive_login = 1;
module_param_named(exclusive_login, sbp2_param_exclusive_login, bool, 0644);
MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device "
		 "(default = Y, use N for concurrent initiators)");

/*
 * Flags for firmware oddities
 *
 * - 128kB max transfer
 *   Limit transfer size. Necessary for some old bridges.
 *
 * - 36 byte inquiry
 *   When scsi_mod probes the device, let the inquiry command look like that
 *   from MS Windows.
 *
 * - skip mode page 8
 *   Suppress sending of mode_sense for mode page 8 if the device pretends to
 *   support the SCSI Primary Block commands instead of Reduced Block Commands.
 *
 * - fix capacity
 *   Tell sd_mod to correct the last sector number reported by read_capacity.
 *   Avoids access beyond actual disk limits on devices with an off-by-one bug.
 *   Don't use this with devices which don't have this bug.
 *
 * - delay inquiry
 *   Wait extra SBP2_INQUIRY_DELAY seconds after login before SCSI inquiry.
 *
 * - power condition
 *   Set the power condition field in the START STOP UNIT commands sent by
 *   sd_mod on suspend, resume, and shutdown (if manage_start_stop is on).
 *   Some disks need this to spin down or to resume properly.
 *
 * - override internal blacklist
 *   Instead of adding to the built-in blacklist, use only the workarounds
 *   specified in the module load parameter.
 *   Useful if a blacklist entry interfered with a non-broken device.
 */
#define SBP2_WORKAROUND_128K_MAX_TRANS	0x1
#define SBP2_WORKAROUND_INQUIRY_36	0x2
#define SBP2_WORKAROUND_MODE_SENSE_8	0x4
#define SBP2_WORKAROUND_FIX_CAPACITY	0x8
#define SBP2_WORKAROUND_DELAY_INQUIRY	0x10
#define SBP2_INQUIRY_DELAY		12
#define SBP2_WORKAROUND_POWER_CONDITION	0x20
#define SBP2_WORKAROUND_OVERRIDE	0x100

static int sbp2_param_workarounds;
module_param_named(workarounds, sbp2_param_workarounds, int, 0644);
MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0"
	", 128kB max transfer = " __stringify(SBP2_WORKAROUND_128K_MAX_TRANS)
	", 36 byte inquiry = "    __stringify(SBP2_WORKAROUND_INQUIRY_36)
	", skip mode page 8 = "   __stringify(SBP2_WORKAROUND_MODE_SENSE_8)
	", fix capacity = "       __stringify(SBP2_WORKAROUND_FIX_CAPACITY)
	", delay inquiry = "      __stringify(SBP2_WORKAROUND_DELAY_INQUIRY)
	", set power condition in start stop unit = "
				  __stringify(SBP2_WORKAROUND_POWER_CONDITION)
	", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
	", or a combination)");

/* I don't know why the SCSI stack doesn't define something like this... */
typedef void (*scsi_done_fn_t)(struct scsi_cmnd *);

static const char sbp2_driver_name[] = "sbp2";

/*
 * We create one struct sbp2_logical_unit per SBP-2 Logical Unit Number Entry
 * and one struct scsi_device per sbp2_logical_unit.
 */
struct sbp2_logical_unit {
	struct sbp2_target *tgt;
	struct list_head link;
	struct fw_address_handler address_handler;
	struct list_head orb_list;

	u64 command_block_agent_address;
	u16 lun;
	int login_id;

	/*
	 * The generation is updated once we've logged in or reconnected
	 * to the logical unit.  Thus, I/O to the device will automatically
	 * fail and get retried if it happens in a window where the device
	 * is not ready, e.g. after a bus reset but before we reconnect.
	 */
	int generation;
	int retries;
	struct delayed_work work;
	bool has_sdev;
	bool blocked;
};

/*
 * We create one struct sbp2_target per IEEE 1212 Unit Directory
 * and one struct Scsi_Host per sbp2_target.
 */
struct sbp2_target {
	struct kref kref;
	struct fw_unit *unit;
	const char *bus_id;
	struct list_head lu_list;

	u64 management_agent_address;
	u64 guid;
	int directory_id;
	int node_id;
	int address_high;
	unsigned int workarounds;
	unsigned int mgt_orb_timeout;
	unsigned int max_payload;

	int dont_block;	/* counter for each logical unit */
	int blocked;	/* ditto */
};

static struct fw_device *target_device(struct sbp2_target *tgt)
{
	return fw_parent_device(tgt->unit);
}

/* Impossible login_id, to detect logout attempt before successful login */
#define INVALID_LOGIN_ID 0x10000

#define SBP2_ORB_TIMEOUT		2000U		/* Timeout in ms */
#define SBP2_ORB_NULL			0x80000000
#define SBP2_RETRY_LIMIT		0xf		/* 15 retries */
#define SBP2_CYCLE_LIMIT		(0xc8 << 12)	/* 200 125us cycles */

/*
 * There is no transport protocol limit to the CDB length,  but we implement
 * a fixed length only.  16 bytes is enough for disks larger than 2 TB.
 */
#define SBP2_MAX_CDB_SIZE		16

/*
 * The default maximum s/g segment size of a FireWire controller is
 * usually 0x10000, but SBP-2 only allows 0xffff. Since buffers have to
 * be quadlet-aligned, we set the length limit to 0xffff & ~3.
 */
#define SBP2_MAX_SEG_SIZE		0xfffc

/* Unit directory keys */
#define SBP2_CSR_UNIT_CHARACTERISTICS	0x3a
#define SBP2_CSR_FIRMWARE_REVISION	0x3c
#define SBP2_CSR_LOGICAL_UNIT_NUMBER	0x14
#define SBP2_CSR_LOGICAL_UNIT_DIRECTORY	0xd4

/* Management orb opcodes */
#define SBP2_LOGIN_REQUEST		0x0
#define SBP2_QUERY_LOGINS_REQUEST	0x1
#define SBP2_RECONNECT_REQUEST		0x3
#define SBP2_SET_PASSWORD_REQUEST	0x4
#define SBP2_LOGOUT_REQUEST		0x7
#define SBP2_ABORT_TASK_REQUEST		0xb
#define SBP2_ABORT_TASK_SET		0xc
#define SBP2_LOGICAL_UNIT_RESET		0xe
#define SBP2_TARGET_RESET_REQUEST	0xf

/* Offsets for command block agent registers */
#define SBP2_AGENT_STATE		0x00
#define SBP2_AGENT_RESET		0x04
#define SBP2_ORB_POINTER		0x08
#define SBP2_DOORBELL			0x10
#define SBP2_UNSOLICITED_STATUS_ENABLE	0x14

/* Status write response codes */
#define SBP2_STATUS_REQUEST_COMPLETE	0x0
#define SBP2_STATUS_TRANSPORT_FAILURE	0x1
#define SBP2_STATUS_ILLEGAL_REQUEST	0x2
#define SBP2_STATUS_VENDOR_DEPENDENT	0x3

#define STATUS_GET_ORB_HIGH(v)		((v).status & 0xffff)
#define STATUS_GET_SBP_STATUS(v)	(((v).status >> 16) & 0xff)
#define STATUS_GET_LEN(v)		(((v).status >> 24) & 0x07)
#define STATUS_GET_DEAD(v)		(((v).status >> 27) & 0x01)
#define STATUS_GET_RESPONSE(v)		(((v).status >> 28) & 0x03)
#define STATUS_GET_SOURCE(v)		(((v).status >> 30) & 0x03)
#define STATUS_GET_ORB_LOW(v)		((v).orb_low)
#define STATUS_GET_DATA(v)		((v).data)

struct sbp2_status {
	u32 status;
	u32 orb_low;
	u8 data[24];
};

struct sbp2_pointer {
	__be32 high;
	__be32 low;
};

struct sbp2_orb {
	struct fw_transaction t;
	struct kref kref;
	dma_addr_t request_bus;
	int rcode;
	struct sbp2_pointer pointer;
	void (*callback)(struct sbp2_orb * orb, struct sbp2_status * status);
	struct list_head link;
};

#define MANAGEMENT_ORB_LUN(v)			((v))
#define MANAGEMENT_ORB_FUNCTION(v)		((v) << 16)
#define MANAGEMENT_ORB_RECONNECT(v)		((v) << 20)
#define MANAGEMENT_ORB_EXCLUSIVE(v)		((v) ? 1 << 28 : 0)
#define MANAGEMENT_ORB_REQUEST_FORMAT(v)	((v) << 29)
#define MANAGEMENT_ORB_NOTIFY			((1) << 31)

#define MANAGEMENT_ORB_RESPONSE_LENGTH(v)	((v))
#define MANAGEMENT_ORB_PASSWORD_LENGTH(v)	((v) << 16)

struct sbp2_management_orb {
	struct sbp2_orb base;
	struct {
		struct sbp2_pointer password;
		struct sbp2_pointer response;
		__be32 misc;
		__be32 length;
		struct sbp2_pointer status_fifo;
	} request;
	__be32 response[4];
	dma_addr_t response_bus;
	struct completion done;
	struct sbp2_status status;
};

struct sbp2_login_response {
	__be32 misc;
	struct sbp2_pointer command_block_agent;
	__be32 reconnect_hold;
};
#define COMMAND_ORB_DATA_SIZE(v)	((v))
#define COMMAND_ORB_PAGE_SIZE(v)	((v) << 16)
#define COMMAND_ORB_PAGE_TABLE_PRESENT	((1) << 19)
#define COMMAND_ORB_MAX_PAYLOAD(v)	((v) << 20)
#define COMMAND_ORB_SPEED(v)		((v) << 24)
#define COMMAND_ORB_DIRECTION		((1) << 27)
#define COMMAND_ORB_REQUEST_FORMAT(v)	((v) << 29)
#define COMMAND_ORB_NOTIFY		((1) << 31)

struct sbp2_command_orb {
	struct sbp2_orb base;
	struct {
		struct sbp2_pointer next;
		struct sbp2_pointer data_descriptor;
		__be32 misc;
		u8 command_block[SBP2_MAX_CDB_SIZE];
	} request;
	struct scsi_cmnd *cmd;
	scsi_done_fn_t done;
	struct sbp2_logical_unit *lu;

	struct sbp2_pointer page_table[SG_ALL] __attribute__((aligned(8)));
	dma_addr_t page_table_bus;
};

#define SBP2_ROM_VALUE_WILDCARD ~0         /* match all */
#define SBP2_ROM_VALUE_MISSING  0xff000000 /* not present in the unit dir. */

/*
 * List of devices with known bugs.
 *
 * The firmware_revision field, masked with 0xffff00, is the best
 * indicator for the type of bridge chip of a device.  It yields a few
 * false positives but this did not break correctly behaving devices
 * so far.
 */
static const struct {
	u32 firmware_revision;
	u32 model;
	unsigned int workarounds;
} sbp2_workarounds_table[] = {
	/* DViCO Momobay CX-1 with TSB42AA9 bridge */ {
		.firmware_revision	= 0x002800,
		.model			= 0x001010,
		.workarounds		= SBP2_WORKAROUND_INQUIRY_36 |
					  SBP2_WORKAROUND_MODE_SENSE_8 |
					  SBP2_WORKAROUND_POWER_CONDITION,
	},
	/* DViCO Momobay FX-3A with TSB42AA9A bridge */ {
		.firmware_revision	= 0x002800,
		.model			= 0x000000,
		.workarounds		= SBP2_WORKAROUND_POWER_CONDITION,
	},
	/* Initio bridges, actually only needed for some older ones */ {
		.firmware_revision	= 0x000200,
		.model			= SBP2_ROM_VALUE_WILDCARD,
		.workarounds		= SBP2_WORKAROUND_INQUIRY_36,
	},
	/* PL-3507 bridge with Prolific firmware */ {
		.firmware_revision	= 0x012800,
		.model			= SBP2_ROM_VALUE_WILDCARD,
		.workarounds		= SBP2_WORKAROUND_POWER_CONDITION,
	},
	/* Symbios bridge */ {
		.firmware_revision	= 0xa0b800,
		.model			= SBP2_ROM_VALUE_WILDCARD,
		.workarounds		= SBP2_WORKAROUND_128K_MAX_TRANS,
	},
	/* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ {
		.firmware_revision	= 0x002600,
		.model			= SBP2_ROM_VALUE_WILDCARD,
		.workarounds		= SBP2_WORKAROUND_128K_MAX_TRANS,
	},
	/*
	 * iPod 2nd generation: needs 128k max transfer size workaround
	 * iPod 3rd generation: needs fix capacity workaround
	 */
	{
		.firmware_revision	= 0x0a2700,
		.model			= 0x000000,
		.workarounds		= SBP2_WORKAROUND_128K_MAX_TRANS |
					  SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod 4th generation */ {
		.firmware_revision	= 0x0a2700,
		.model			= 0x000021,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod mini */ {
		.firmware_revision	= 0x0a2700,
		.model			= 0x000022,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod mini */ {
		.firmware_revision	= 0x0a2700,
		.model			= 0x000023,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod Photo */ {
		.firmware_revision	= 0x0a2700,
		.model			= 0x00007e,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	}
};

static void free_orb(struct kref *kref)
{
	struct sbp2_orb *orb = container_of(kref, struct sbp2_orb, kref);

	kfree(orb);
}

static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
			      int tcode, int destination, int source,
			      int generation, int speed,
			      unsigned long long offset,
			      void *payload, size_t length, void *callback_data)
{
	struct sbp2_logical_unit *lu = callback_data;
	struct sbp2_orb *orb;
	struct sbp2_status status;
	unsigned long flags;

	if (tcode != TCODE_WRITE_BLOCK_REQUEST ||
	    length < 8 || length > sizeof(status)) {
		fw_send_response(card, request, RCODE_TYPE_ERROR);
		return;
	}

	status.status  = be32_to_cpup(payload);
	status.orb_low = be32_to_cpup(payload + 4);
	memset(status.data, 0, sizeof(status.data));
	if (length > 8)
		memcpy(status.data, payload + 8, length - 8);

	if (STATUS_GET_SOURCE(status) == 2 || STATUS_GET_SOURCE(status) == 3) {
		fw_notify("non-orb related status write, not handled\n");
		fw_send_response(card, request, RCODE_COMPLETE);
		return;
	}

	/* Lookup the orb corresponding to this status write. */
	spin_lock_irqsave(&card->lock, flags);
	list_for_each_entry(orb, &lu->orb_list, link) {
		if (STATUS_GET_ORB_HIGH(status) == 0 &&
		    STATUS_GET_ORB_LOW(status) == orb->request_bus) {
			orb->rcode = RCODE_COMPLETE;
			list_del(&orb->link);
			break;
		}
	}
	spin_unlock_irqrestore(&card->lock, flags);

	if (&orb->link != &lu->orb_list) {
		orb->callback(orb, &status);
		kref_put(&orb->kref, free_orb);
	} else {
		fw_error("status write for unknown orb\n");
	}

	fw_send_response(card, request, RCODE_COMPLETE);
}

static void complete_transaction(struct fw_card *card, int rcode,
				 void *payload, size_t length, void *data)
{
	struct sbp2_orb *orb = data;
	unsigned long flags;

	/*
	 * This is a little tricky.  We can get the status write for
	 * the orb before we get this callback.  The status write
	 * handler above will assume the orb pointer transaction was
	 * successful and set the rcode to RCODE_COMPLETE for the orb.
	 * So this callback only sets the rcode if it hasn't already
	 * been set and only does the cleanup if the transaction
	 * failed and we didn't already get a status write.
	 */
	spin_lock_irqsave(&card->lock, flags);

	if (orb->rcode == -1)
		orb->rcode = rcode;
	if (orb->rcode != RCODE_COMPLETE) {
		list_del(&orb->link);
		spin_unlock_irqrestore(&card->lock, flags);
		orb->callback(orb, NULL);
	} else {
		spin_unlock_irqrestore(&card->lock, flags);
	}

	kref_put(&orb->kref, free_orb);
}

static void sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu,
			  int node_id, int generation, u64 offset)
{
	struct fw_device *device = target_device(lu->tgt);
	unsigned long flags;