[libmultipath] add support for IBM 3526
[platform/upstream/multipath-tools.git] / libmultipath / hwtable.c
1 #include <stdio.h>
2
3 #include <checkers.h>
4
5 #include "vector.h"
6 #include "defaults.h"
7 #include "structs.h"
8 #include "config.h"
9 #include "pgpolicies.h"
10
11 /*
12  * Tuning suggestions on these parameters should go to
13  * dm-devel@redhat.com
14  * 
15  * You are welcome to claim maintainership over a controller
16  * family. Please mail the currently enlisted maintainer and
17  * the upstream package maintainer.
18  */
19 static struct hwentry default_hw[] = {
20         /*
21          * Apple controller family
22          *
23          * Maintainer : Shyam Sundar
24          * Mail : g.shyamsundar@yahoo.co.in
25          */
26         {
27                 .vendor        = "APPLE*",
28                 .product       = "Xserve RAID ",
29                 .getuid        = DEFAULT_GETUID,
30                 .getprio       = NULL,
31                 .features      = DEFAULT_FEATURES,
32                 .hwhandler     = DEFAULT_HWHANDLER,
33                 .selector      = DEFAULT_SELECTOR,
34                 .pgpolicy      = MULTIBUS,
35                 .pgfailback    = FAILBACK_UNDEF,
36                 .rr_weight     = RR_WEIGHT_NONE,
37                 .no_path_retry = NO_PATH_RETRY_UNDEF,
38                 .minio         = DEFAULT_MINIO,
39                 .checker_name  = DEFAULT_CHECKER,
40         },
41         /*
42          * StorageWorks controller family
43          *
44          * Maintainer : Christophe Varoqui
45          * Mail : christophe.varoqui@free.fr
46          */
47         {
48                 .vendor        = "3PARdata",
49                 .product       = "VV",
50                 .getuid        = DEFAULT_GETUID,
51                 .getprio       = NULL,
52                 .features      = DEFAULT_FEATURES,
53                 .hwhandler     = DEFAULT_HWHANDLER,
54                 .selector      = DEFAULT_SELECTOR,
55                 .pgpolicy      = MULTIBUS,
56                 .pgfailback    = FAILBACK_UNDEF,
57                 .rr_weight     = RR_WEIGHT_NONE,
58                 .no_path_retry = NO_PATH_RETRY_UNDEF,
59                 .minio         = DEFAULT_MINIO,
60                 .checker_name  = DEFAULT_CHECKER,
61         },
62         {
63                 .vendor        = "DEC",
64                 .product       = "HSG80",
65                 .getuid        = DEFAULT_GETUID,
66                 .getprio       = NULL,
67                 .features      = DEFAULT_FEATURES,
68                 .hwhandler     = "1 hp_sw",
69                 .selector      = DEFAULT_SELECTOR,
70                 .pgpolicy      = GROUP_BY_SERIAL,
71                 .pgfailback    = FAILBACK_UNDEF,
72                 .rr_weight     = RR_WEIGHT_NONE,
73                 .no_path_retry = NO_PATH_RETRY_UNDEF,
74                 .minio         = DEFAULT_MINIO,
75                 .checker_name  = HP_SW,
76         },
77         {
78                 .vendor        = "{COMPAQ,HP}",
79                 .product       = "{MSA,HSV}1*",
80                 .getuid        = DEFAULT_GETUID,
81                 .getprio       = NULL,
82                 .features      = DEFAULT_FEATURES,
83                 .hwhandler     = "1 hp_sw",
84                 .selector      = DEFAULT_SELECTOR,
85                 .pgpolicy      = GROUP_BY_SERIAL,
86                 .pgfailback    = FAILBACK_UNDEF,
87                 .rr_weight     = RR_WEIGHT_NONE,
88                 .no_path_retry = NO_PATH_RETRY_UNDEF,
89                 .minio         = DEFAULT_MINIO,
90                 .checker_name  = HP_SW,
91         },
92         {
93                 .vendor        = "HP",
94                 .product       = "{HSV2*,A6189A}",
95                 .getuid        = DEFAULT_GETUID,
96                 .getprio       = NULL,
97                 .features      = DEFAULT_FEATURES,
98                 .hwhandler     = DEFAULT_HWHANDLER,
99                 .selector      = DEFAULT_SELECTOR,
100                 .pgpolicy      = MULTIBUS,
101                 .pgfailback    = FAILBACK_UNDEF,
102                 .rr_weight     = RR_WEIGHT_NONE,
103                 .no_path_retry = NO_PATH_RETRY_UNDEF,
104                 .minio         = DEFAULT_MINIO,
105                 .checker_name  = READSECTOR0,
106         },
107         /*
108          * DDN controller family
109          *
110          * Maintainer : Christophe Varoqui
111          * Mail : christophe.varoqui@free.fr
112          */
113         {
114                 .vendor        = "DDN",
115                 .product       = "SAN DataDirector",
116                 .getuid        = DEFAULT_GETUID,
117                 .getprio       = NULL,
118                 .features      = DEFAULT_FEATURES,
119                 .hwhandler     = DEFAULT_HWHANDLER,
120                 .selector      = DEFAULT_SELECTOR,
121                 .pgpolicy      = MULTIBUS,
122                 .pgfailback    = FAILBACK_UNDEF,
123                 .rr_weight     = RR_WEIGHT_NONE,
124                 .no_path_retry = NO_PATH_RETRY_UNDEF,
125                 .minio         = DEFAULT_MINIO,
126                 .checker_name  = READSECTOR0,
127         },
128         /*
129          * EMC / Clariion controller family
130          *
131          * Maintainer : Edward Goggin, EMC
132          * Mail : egoggin@emc.com
133          */
134         {
135                 .vendor        = "EMC",
136                 .product       = "SYMMETRIX",
137                 .getuid        = "/sbin/scsi_id -g -u -ppre-spc3-83 -s /block/%n",
138                 .getprio       = NULL,
139                 .features      = DEFAULT_FEATURES,
140                 .hwhandler     = DEFAULT_HWHANDLER,
141                 .selector      = DEFAULT_SELECTOR,
142                 .pgpolicy      = MULTIBUS,
143                 .pgfailback    = FAILBACK_UNDEF,
144                 .rr_weight     = RR_WEIGHT_NONE,
145                 .no_path_retry = NO_PATH_RETRY_UNDEF,
146                 .minio         = DEFAULT_MINIO,
147                 .checker_name  = READSECTOR0,
148         },
149         {
150                 .vendor        = "DGC",
151                 .product       = "*",
152                 .bl_product    = "LUNZ",
153                 .getuid        = DEFAULT_GETUID,
154                 .getprio       = "mpath_prio_emc /dev/%n",
155                 .features      = "1 queue_if_no_path",
156                 .hwhandler     = "1 emc",
157                 .selector      = DEFAULT_SELECTOR,
158                 .pgpolicy      = GROUP_BY_PRIO,
159                 .pgfailback    = -FAILBACK_IMMEDIATE,
160                 .rr_weight     = RR_WEIGHT_NONE,
161                 .no_path_retry = (300 / DEFAULT_CHECKINT),
162                 .minio         = DEFAULT_MINIO,
163                 .checker_name  = EMC_CLARIION,
164         },
165         /*
166          * Fujitsu controller family
167          *
168          * Maintainer : Christophe Varoqui
169          * Mail : christophe.varoqui@free.fr
170          */
171         {
172                 .vendor        = "FSC",
173                 .product       = "CentricStor",
174                 .getuid        = DEFAULT_GETUID,
175                 .getprio       = NULL,
176                 .features      = DEFAULT_FEATURES,
177                 .hwhandler     = DEFAULT_HWHANDLER,
178                 .selector      = DEFAULT_SELECTOR,
179                 .pgpolicy      = GROUP_BY_SERIAL,
180                 .pgfailback    = FAILBACK_UNDEF,
181                 .rr_weight     = RR_WEIGHT_NONE,
182                 .no_path_retry = NO_PATH_RETRY_UNDEF,
183                 .minio         = DEFAULT_MINIO,
184                 .checker_name  = READSECTOR0,
185         },
186         /*
187          * Hitachi controller family
188          *
189          * Maintainer : Matthias Rudolph
190          * Mail : matthias.rudolph@hds.com
191          */
192         {
193                 .vendor        = "{HITACHI,HP}",
194                 .product       = "OPEN-*",
195                 .getuid        = DEFAULT_GETUID,
196                 .getprio       = NULL,
197                 .features      = DEFAULT_FEATURES,
198                 .hwhandler     = DEFAULT_HWHANDLER,
199                 .selector      = DEFAULT_SELECTOR,
200                 .pgpolicy      = MULTIBUS,
201                 .pgfailback    = FAILBACK_UNDEF,
202                 .rr_weight     = RR_WEIGHT_NONE,
203                 .no_path_retry = NO_PATH_RETRY_UNDEF,
204                 .minio         = DEFAULT_MINIO,
205                 .checker_name  = READSECTOR0,
206         },
207         {
208                 .vendor        = "HITACHI",
209                 .product       = "DF*",
210                 .getuid        = DEFAULT_GETUID,
211                 .getprio       = "/sbin/mpath_prio_hds_modular %d",
212                 .features      = DEFAULT_FEATURES,
213                 .hwhandler     = DEFAULT_HWHANDLER,
214                 .selector      = DEFAULT_SELECTOR,
215                 .pgpolicy      = GROUP_BY_PRIO,
216                 .pgfailback    = -FAILBACK_IMMEDIATE,
217                 .rr_weight     = RR_WEIGHT_NONE,
218                 .no_path_retry = NO_PATH_RETRY_UNDEF,
219                 .minio         = DEFAULT_MINIO,
220                 .checker_name  = READSECTOR0,
221         },
222         /*
223          * IBM controller family
224          *
225          * Maintainer : Hannes Reinecke, SuSE
226          * Mail : hare@suse.de
227          */
228         {
229                 .vendor        = "IBM",
230                 .product       = "ProFibre 4000R",
231                 .getuid        = DEFAULT_GETUID,
232                 .getprio       = NULL,
233                 .features      = DEFAULT_FEATURES,
234                 .hwhandler     = DEFAULT_HWHANDLER,
235                 .selector      = DEFAULT_SELECTOR,
236                 .pgpolicy      = MULTIBUS,
237                 .pgfailback    = FAILBACK_UNDEF,
238                 .rr_weight     = RR_WEIGHT_NONE,
239                 .no_path_retry = NO_PATH_RETRY_UNDEF,
240                 .minio         = DEFAULT_MINIO,
241                 .checker_name  = READSECTOR0,
242         },
243         {
244                 /* IBM DS4100 / FAStT100 */
245                 .vendor        = "IBM",
246                 .product       = "1742",
247                 .getuid        = DEFAULT_GETUID,
248                 .getprio       = "mpath_prio_tpc /dev/%n",
249                 .features      = DEFAULT_FEATURES,
250                 .hwhandler     = DEFAULT_HWHANDLER,
251                 .selector      = DEFAULT_SELECTOR,
252                 .pgpolicy      = GROUP_BY_PRIO,
253                 .pgfailback    = -FAILBACK_IMMEDIATE,
254                 .rr_weight     = RR_WEIGHT_NONE,
255                 .no_path_retry = NO_PATH_RETRY_UNDEF,
256                 .minio         = DEFAULT_MINIO,
257                 .checker_name  = TUR,
258         },
259         {
260                 /* IBM Netfinity Fibre Channel RAID Controller Unit */
261                 .vendor        = "IBM",
262                 .product       = "3526",
263                 .getuid        = DEFAULT_GETUID,
264                 .getprio       = "/sbin/mpath_prio_tpc /dev/%n",
265                 .features      = DEFAULT_FEATURES,
266                 .hwhandler     = DEFAULT_HWHANDLER,
267                 .selector      = DEFAULT_SELECTOR,
268                 .pgpolicy      = GROUP_BY_PRIO,
269                 .pgfailback    = -FAILBACK_IMMEDIATE,
270                 .rr_weight     = RR_WEIGHT_NONE,
271                 .no_path_retry = NO_PATH_RETRY_UNDEF,
272                 .minio         = DEFAULT_MINIO,
273                 .checker_name  = TUR,
274         },
275         {
276                 /* IBM DS4200 / FAStT200 */
277                 .vendor        = "IBM",
278                 .product       = "3542",
279                 .getuid        = DEFAULT_GETUID,
280                 .getprio       = NULL,
281                 .features      = DEFAULT_FEATURES,
282                 .hwhandler     = DEFAULT_HWHANDLER,
283                 .selector      = DEFAULT_SELECTOR,
284                 .pgpolicy      = GROUP_BY_SERIAL,
285                 .pgfailback    = FAILBACK_UNDEF,
286                 .rr_weight     = RR_WEIGHT_NONE,
287                 .no_path_retry = NO_PATH_RETRY_UNDEF,
288                 .minio         = DEFAULT_MINIO,
289                 .checker_name  = TUR,
290         },
291         {
292                 /* IBM ESS F20 aka Shark */
293                 .vendor        = "IBM",
294                 .product       = "2105{800,F20}",
295                 .getuid        = DEFAULT_GETUID,
296                 .getprio       = NULL,
297                 .features      = "1 queue_if_no_path",
298                 .hwhandler     = DEFAULT_HWHANDLER,
299                 .selector      = DEFAULT_SELECTOR,
300                 .pgpolicy      = GROUP_BY_SERIAL,
301                 .pgfailback    = FAILBACK_UNDEF,
302                 .rr_weight     = RR_WEIGHT_NONE,
303                 .no_path_retry = NO_PATH_RETRY_UNDEF,
304                 .minio         = DEFAULT_MINIO,
305                 .checker_name  = TUR,
306         },
307         {
308                 /* IBM DS6000 / SAN Volume Controller */
309                 .vendor        = "IBM",
310                 .product       = "{1750500,2145}",
311                 .getuid        = DEFAULT_GETUID,
312                 .getprio       = "mpath_prio_alua /dev/%n",
313                 .features      = "1 queue_if_no_path",
314                 .hwhandler     = DEFAULT_HWHANDLER,
315                 .selector      = DEFAULT_SELECTOR,
316                 .pgpolicy      = GROUP_BY_PRIO,
317                 .pgfailback    = -FAILBACK_IMMEDIATE,
318                 .rr_weight     = RR_WEIGHT_NONE,
319                 .no_path_retry = NO_PATH_RETRY_UNDEF,
320                 .minio         = DEFAULT_MINIO,
321                 .checker_name  = TUR,
322         },
323         {
324                 /* IBM DS8000 */
325                 .vendor        = "IBM",
326                 .product       = "2107900",
327                 .getuid        = DEFAULT_GETUID,
328                 .getprio       = NULL,
329                 .features      = "1 queue_if_no_path",
330                 .hwhandler     = DEFAULT_HWHANDLER,
331                 .selector      = DEFAULT_SELECTOR,
332                 .pgpolicy      = GROUP_BY_SERIAL,
333                 .pgfailback    = FAILBACK_UNDEF,
334                 .rr_weight     = RR_WEIGHT_NONE,
335                 .no_path_retry = NO_PATH_RETRY_UNDEF,
336                 .minio         = DEFAULT_MINIO,
337                 .checker_name  = TUR,
338         },
339         {
340                 /* IBM S/390 ECKD DASD */
341                 .vendor        = "IBM",
342                 .product       = "S/390 DASD ECKD",
343                 .getuid        = "/sbin/dasd_id /dev/%n",
344                 .getprio       = NULL,
345                 .features      = DEFAULT_FEATURES,
346                 .hwhandler     = DEFAULT_HWHANDLER,
347                 .selector      = DEFAULT_SELECTOR,
348                 .pgpolicy      = MULTIBUS,
349                 .pgfailback    = FAILBACK_UNDEF,
350                 .rr_weight     = RR_WEIGHT_NONE,
351                 .no_path_retry = NO_PATH_RETRY_UNDEF,
352                 .minio         = DEFAULT_MINIO,
353                 .checker_name  = DIRECTIO,
354         },
355         /*
356          * NETAPP controller family
357          *
358          * Maintainer : Dave Wysochanski
359          * Mail : davidw@netapp.com
360          */
361         {
362                 .vendor        = "NETAPP",
363                 .product       = "LUN.*",
364                 .getuid        = DEFAULT_GETUID,
365                 .getprio       = "mpath_prio_netapp /dev/%n",
366                 .features      = "1 queue_if_no_path",
367                 .hwhandler     = DEFAULT_HWHANDLER,
368                 .selector      = DEFAULT_SELECTOR,
369                 .pgpolicy      = GROUP_BY_PRIO,
370                 .pgfailback    = -FAILBACK_IMMEDIATE,
371                 .rr_weight     = RR_WEIGHT_NONE,
372                 .no_path_retry = NO_PATH_RETRY_UNDEF,
373                 .minio         = 128,
374                 .checker_name  = READSECTOR0,
375         },
376         /*
377          * IBM NSeries (NETAPP) controller family
378          *
379          * Maintainer : Dave Wysochanski
380          * Mail : davidw@netapp.com
381          */
382         {
383                 .vendor        = "IBM",
384                 .product       = "Nseries.*",
385                 .getuid        = DEFAULT_GETUID,
386                 .getprio       = "mpath_prio_netapp /dev/%n",
387                 .features      = "1 queue_if_no_path",
388                 .hwhandler     = DEFAULT_HWHANDLER,
389                 .selector      = DEFAULT_SELECTOR,
390                 .pgpolicy      = GROUP_BY_PRIO,
391                 .pgfailback    = -FAILBACK_IMMEDIATE,
392                 .rr_weight     = RR_WEIGHT_NONE,
393                 .no_path_retry = NO_PATH_RETRY_UNDEF,
394                 .minio         = 128,
395                 .checker_name  = READSECTOR0,
396         },
397         /*
398          * Pillar Data controller family
399          *
400          * Maintainer : Christophe Varoqui
401          * Mail : christophe.varoqui@free.fr
402          */
403         {
404                 .vendor        = "Pillar",
405                 .product       = "Axiom 500",
406                 .getuid        = DEFAULT_GETUID,
407                 .getprio       = "mpath_prio_alua %d",
408                 .features      = DEFAULT_FEATURES,
409                 .hwhandler     = DEFAULT_HWHANDLER,
410                 .selector      = DEFAULT_SELECTOR,
411                 .pgpolicy      = GROUP_BY_PRIO,
412                 .pgfailback    = FAILBACK_UNDEF,
413                 .rr_weight     = RR_WEIGHT_NONE,
414                 .no_path_retry = NO_PATH_RETRY_UNDEF,
415                 .minio         = DEFAULT_MINIO,
416                 .checker_name  = TUR,
417         },
418         /*
419          * SGI arrays
420          *
421          * Maintainer : Christophe Varoqui
422          * Mail : christophe.varoqui@free.fr
423          */
424         {
425                 .vendor        = "SGI",
426                 .product       = "TP9[13]00",
427                 .getuid        = DEFAULT_GETUID,
428                 .getprio       = NULL,
429                 .features      = DEFAULT_FEATURES,
430                 .hwhandler     = DEFAULT_HWHANDLER,
431                 .selector      = DEFAULT_SELECTOR,
432                 .pgpolicy      = MULTIBUS,
433                 .pgfailback    = FAILBACK_UNDEF,
434                 .rr_weight     = RR_WEIGHT_NONE,
435                 .no_path_retry = NO_PATH_RETRY_UNDEF,
436                 .minio         = DEFAULT_MINIO,
437                 .checker_name  = READSECTOR0,
438         },
439         {
440                 .vendor        = "SGI",
441                 .product       = "TP9[45]00",
442                 .getuid        = DEFAULT_GETUID,
443                 .getprio       = "mpath_prio_tpc /dev/%n",
444                 .features      = DEFAULT_FEATURES,
445                 .hwhandler     = DEFAULT_HWHANDLER,
446                 .selector      = DEFAULT_SELECTOR,
447                 .pgpolicy      = GROUP_BY_PRIO,
448                 .pgfailback    = -FAILBACK_IMMEDIATE,
449                 .rr_weight     = RR_WEIGHT_NONE,
450                 .no_path_retry = NO_PATH_RETRY_UNDEF,
451                 .minio         = DEFAULT_MINIO,
452                 .checker_name  = TUR,
453         },
454         /*
455          * STK arrays
456          *
457          * Maintainer : Christophe Varoqui
458          * Mail : christophe.varoqui@free.fr
459          */
460         {
461                 .vendor        = "STK",
462                 .product       = "OPENstorage D280",
463                 .getuid        = DEFAULT_GETUID,
464                 .getprio       = "mpath_prio_tpc /dev/%n",
465                 .features      = DEFAULT_FEATURES,
466                 .hwhandler     = DEFAULT_HWHANDLER,
467                 .selector      = DEFAULT_SELECTOR,
468                 .pgpolicy      = GROUP_BY_PRIO,
469                 .pgfailback    = -FAILBACK_IMMEDIATE,
470                 .rr_weight     = RR_WEIGHT_NONE,
471                 .no_path_retry = NO_PATH_RETRY_UNDEF,
472                 .minio         = DEFAULT_MINIO,
473                 .checker_name  = TUR,
474         },
475         /*
476          * SUN arrays
477          *
478          * Maintainer : Christophe Varoqui
479          * Mail : christophe.varoqui@free.fr
480          */
481         {
482                 .vendor        = "SUN",
483                 .product       = "{StorEdge 3510,T4}",
484                 .getuid        = DEFAULT_GETUID,
485                 .getprio       = NULL,
486                 .features      = DEFAULT_FEATURES,
487                 .hwhandler     = DEFAULT_HWHANDLER,
488                 .selector      = DEFAULT_SELECTOR,
489                 .pgpolicy      = MULTIBUS,
490                 .pgfailback    = FAILBACK_UNDEF,
491                 .rr_weight     = RR_WEIGHT_NONE,
492                 .no_path_retry = NO_PATH_RETRY_UNDEF,
493                 .minio         = DEFAULT_MINIO,
494                 .checker_name  = READSECTOR0,
495         },
496         /*
497          * EOL
498          */
499         {
500                 .vendor        = NULL,
501                 .product       = NULL,
502                 .getuid        = NULL,
503                 .getprio       = NULL,
504                 .features      = NULL,
505                 .hwhandler     = NULL,
506                 .selector      = NULL,
507                 .pgpolicy      = 0,
508                 .pgfailback    = 0,
509                 .rr_weight     = 0,
510                 .no_path_retry = 0,
511                 .minio         = 0,
512                 .checker_name  = NULL,
513         },
514 };
515
516 extern int
517 setup_default_hwtable (vector hw)
518 {
519         int r = 0;
520         struct hwentry * hwe = default_hw;
521
522         while (hwe->vendor) {
523                 hwe->checker = checker_lookup(hwe->checker_name);
524                 r += store_hwe(hw, hwe);
525                 hwe++;
526         }
527         return r;
528 }