Imported Upstream version 0.5.0
[platform/upstream/multipath-tools.git] / libmultipath / hwtable.c
1 #include <stdio.h>
2
3 #include "checkers.h"
4 #include "vector.h"
5 #include "defaults.h"
6 #include "structs.h"
7 #include "config.h"
8 #include "pgpolicies.h"
9 #include "prio.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          * Compellent Technologies, Inc.
22          *
23          * Maintainer : Jim Lester, Compellent
24          * Mail : jim.lester@compellent.com
25          */
26         {
27                 .vendor        = "COMPELNT",
28                 .product       = "Compellent Vol",
29                 .features      = DEFAULT_FEATURES,
30                 .hwhandler     = DEFAULT_HWHANDLER,
31                 .pgpolicy      = MULTIBUS,
32                 .pgfailback    = -FAILBACK_IMMEDIATE,
33                 .rr_weight     = RR_WEIGHT_NONE,
34                 .no_path_retry = NO_PATH_RETRY_QUEUE,
35                 .checker_name  = TUR,
36                 .prio_name     = DEFAULT_PRIO,
37                 .prio_args     = NULL,
38         },
39         /*
40          * Apple controller family
41          *
42          * Maintainer : Shyam Sundar
43          * Mail : g.shyamsundar@yahoo.co.in
44          */
45         {
46                 .vendor        = "APPLE*",
47                 .product       = "Xserve RAID ",
48                 .features      = DEFAULT_FEATURES,
49                 .hwhandler     = DEFAULT_HWHANDLER,
50                 .pgpolicy      = MULTIBUS,
51                 .pgfailback    = FAILBACK_UNDEF,
52                 .rr_weight     = RR_WEIGHT_NONE,
53                 .no_path_retry = NO_PATH_RETRY_UNDEF,
54                 .checker_name  = DEFAULT_CHECKER,
55                 .prio_name     = DEFAULT_PRIO,
56                 .prio_args     = NULL,
57         },
58         /*
59          * StorageWorks controller family
60          *
61          * Maintainer : Christophe Varoqui
62          * Mail : christophe.varoqui@opensvc.com
63          */
64         {
65                 .vendor        = "3PARdata",
66                 .product       = "VV",
67                 .features      = DEFAULT_FEATURES,
68                 .hwhandler     = DEFAULT_HWHANDLER,
69                 .pgpolicy      = MULTIBUS,
70                 .pgfailback    = FAILBACK_UNDEF,
71                 .rr_weight     = RR_WEIGHT_NONE,
72                 .no_path_retry = NO_PATH_RETRY_UNDEF,
73                 .checker_name  = DEFAULT_CHECKER,
74                 .prio_name     = DEFAULT_PRIO,
75                 .prio_args     = NULL,
76         },
77         {
78                 .vendor        = "DEC",
79                 .product       = "HSG80",
80                 .features      = "1 queue_if_no_path",
81                 .hwhandler     = "1 hp_sw",
82                 .pgpolicy      = GROUP_BY_PRIO,
83                 .pgfailback    = FAILBACK_UNDEF,
84                 .rr_weight     = RR_WEIGHT_NONE,
85                 .no_path_retry = NO_PATH_RETRY_UNDEF,
86                 .checker_name  = HP_SW,
87                 .prio_name     = PRIO_HP_SW,
88                 .prio_args     = NULL,
89         },
90         {
91                 .vendor        = "HP",
92                 .product       = "A6189A",
93                 .features      = DEFAULT_FEATURES,
94                 .hwhandler     = DEFAULT_HWHANDLER,
95                 .pgpolicy      = MULTIBUS,
96                 .pgfailback    = FAILBACK_UNDEF,
97                 .rr_weight     = RR_WEIGHT_NONE,
98                 .no_path_retry = 12,
99                 .checker_name  = DIRECTIO,
100                 .prio_name     = DEFAULT_PRIO,
101                 .prio_args     = NULL,
102         },
103         {
104                 /* MSA 1000/MSA1500 EVA 3000/5000 with old firmware */
105                 .vendor        = "(COMPAQ|HP)",
106                 .product       = "(MSA|HSV)1.0.*",
107                 .features      = "1 queue_if_no_path",
108                 .hwhandler     = "1 hp_sw",
109                 .pgpolicy      = GROUP_BY_PRIO,
110                 .pgfailback    = FAILBACK_UNDEF,
111                 .rr_weight     = RR_WEIGHT_NONE,
112                 .no_path_retry = 12,
113                 .minio         = 100,
114                 .checker_name  = HP_SW,
115                 .prio_name     = PRIO_HP_SW,
116                 .prio_args     = NULL,
117         },
118         {
119                 /* MSA 1000/1500 with new firmware */
120                 .vendor        = "(COMPAQ|HP)",
121                 .product       = "MSA VOLUME",
122                 .features      = DEFAULT_FEATURES,
123                 .hwhandler     = DEFAULT_HWHANDLER,
124                 .pgpolicy      = GROUP_BY_PRIO,
125                 .pgfailback    = -FAILBACK_IMMEDIATE,
126                 .rr_weight     = RR_WEIGHT_NONE,
127                 .no_path_retry = 12,
128                 .minio         = 100,
129                 .checker_name  = TUR,
130                 .prio_name     = PRIO_ALUA,
131                 .prio_args     = NULL,
132         },
133         {
134                 /* EVA 3000/5000 with new firmware, EVA 4000/6000/8000 */
135                 .vendor        = "(COMPAQ|HP)",
136                 .product       = "HSV1[01]1|HSV2[01]0|HSV3[046]0|HSV4[05]0",
137                 .features      = DEFAULT_FEATURES,
138                 .hwhandler     = DEFAULT_HWHANDLER,
139                 .pgpolicy      = GROUP_BY_PRIO,
140                 .pgfailback    = -FAILBACK_IMMEDIATE,
141                 .rr_weight     = RR_WEIGHT_NONE,
142                 .no_path_retry = 12,
143                 .minio         = 100,
144                 .checker_name  = TUR,
145                 .prio_name     = PRIO_ALUA,
146                 .prio_args     = NULL,
147         },
148         {
149                 /* HP MSA2000 product family with old firmware */
150                 .vendor        = "HP",
151                 .product       = "MSA2[02]12fc|MSA2012i",
152                 .features      = DEFAULT_FEATURES,
153                 .hwhandler     = DEFAULT_HWHANDLER,
154                 .pgpolicy      = MULTIBUS,
155                 .pgfailback    = -FAILBACK_IMMEDIATE,
156                 .rr_weight     = RR_WEIGHT_NONE,
157                 .no_path_retry = 18,
158                 .minio         = 100,
159                 .checker_name  = TUR,
160                 .prio_name     = DEFAULT_PRIO,
161                 .prio_args     = NULL,
162         },
163         {
164                 /* HP MSA2000 product family with new firmware */
165                 .vendor        = "HP",
166                 .product       = "MSA2012sa|MSA23(12|24)(fc|i|sa)|MSA2000s VOLUME",
167                 .features      = DEFAULT_FEATURES,
168                 .hwhandler     = DEFAULT_HWHANDLER,
169                 .pgpolicy      = GROUP_BY_PRIO,
170                 .pgfailback    = -FAILBACK_IMMEDIATE,
171                 .rr_weight     = RR_WEIGHT_NONE,
172                 .no_path_retry = 18,
173                 .minio         = 100,
174                 .checker_name  = TUR,
175                 .prio_name     = PRIO_ALUA,
176                 .prio_args     = NULL,
177         },
178
179         {
180                 /* HP SVSP */
181                 .vendor        = "HP",
182                 .product       = "HSVX700",
183                 .features      = DEFAULT_FEATURES,
184                 .hwhandler     = "1 alua",
185                 .pgpolicy      = GROUP_BY_PRIO,
186                 .pgfailback    = -FAILBACK_IMMEDIATE,
187                 .rr_weight     = RR_WEIGHT_NONE,
188                 .no_path_retry = 12,
189                 .minio         = 100,
190                 .checker_name  = TUR,
191                 .prio_name     = PRIO_ALUA,
192                 .prio_args     = NULL,
193         },
194
195         {
196                 /* HP Smart Array */
197                 .vendor        = "HP",
198                 .product       = "LOGICAL VOLUME.*",
199                 .features      = DEFAULT_FEATURES,
200                 .hwhandler     = DEFAULT_HWHANDLER,
201                 .pgpolicy      = MULTIBUS,
202                 .pgfailback    = FAILBACK_UNDEF,
203                 .rr_weight     = RR_WEIGHT_NONE,
204                 .no_path_retry = 12,
205                 .checker_name  = TUR,
206                 .prio_name     = DEFAULT_PRIO,
207                 .prio_args     = NULL,
208         },
209         {
210                 /* HP P2000 family arrays */
211                 .vendor        = "HP",
212                 .product       = "P2000 G3 FC|P2000G3 FC/iSCSI|P2000 G3 SAS|P2000 G3 iSCSI",
213                 .features      = DEFAULT_FEATURES,
214                 .hwhandler     = DEFAULT_HWHANDLER,
215                 .pgpolicy      = GROUP_BY_PRIO,
216                 .pgfailback    = -FAILBACK_IMMEDIATE,
217                 .rr_weight     = RR_WEIGHT_NONE,
218                 .no_path_retry = 18,
219                 .minio         = 100,
220                 .checker_name  = TUR,
221                 .prio_name     = PRIO_ALUA,
222                 .prio_args     = NULL,
223         },
224         /*
225          * DDN controller family
226          *
227          * Maintainer : Christophe Varoqui
228          * Mail : christophe.varoqui@opensvc.com
229          */
230         {
231                 .vendor        = "DDN",
232                 .product       = "SAN DataDirector",
233                 .features      = DEFAULT_FEATURES,
234                 .hwhandler     = DEFAULT_HWHANDLER,
235                 .pgpolicy      = MULTIBUS,
236                 .pgfailback    = FAILBACK_UNDEF,
237                 .rr_weight     = RR_WEIGHT_NONE,
238                 .no_path_retry = NO_PATH_RETRY_UNDEF,
239                 .checker_name  = DIRECTIO,
240                 .prio_name     = DEFAULT_PRIO,
241                 .prio_args     = NULL,
242         },
243         /*
244          * EMC / Clariion controller family
245          *
246          * Maintainer : Edward Goggin, EMC
247          * Mail : egoggin@emc.com
248          */
249         {
250                 .vendor        = "EMC",
251                 .product       = "SYMMETRIX",
252                 .features      = DEFAULT_FEATURES,
253                 .hwhandler     = DEFAULT_HWHANDLER,
254                 .pgpolicy      = MULTIBUS,
255                 .pgfailback    = FAILBACK_UNDEF,
256                 .rr_weight     = RR_WEIGHT_NONE,
257                 .no_path_retry = 6,
258                 .checker_name  = TUR,
259                 .prio_name     = DEFAULT_PRIO,
260                 .prio_args     = NULL,
261         },
262         {
263                 .vendor        = "DGC",
264                 .product       = ".*",
265                 .bl_product    = "LUNZ",
266                 .features      = "1 queue_if_no_path",
267                 .hwhandler     = "1 emc",
268                 .pgpolicy      = GROUP_BY_PRIO,
269                 .pgfailback    = -FAILBACK_IMMEDIATE,
270                 .rr_weight     = RR_WEIGHT_NONE,
271                 .no_path_retry = (300 / DEFAULT_CHECKINT),
272                 .checker_name  = EMC_CLARIION,
273                 .prio_name     = PRIO_EMC,
274                 .prio_args     = NULL,
275         },
276         {
277                 .vendor        = "EMC",
278                 .product       = "Invista",
279                 .bl_product    = "LUNZ",
280                 .features      = DEFAULT_FEATURES,
281                 .hwhandler     = DEFAULT_HWHANDLER,
282                 .pgpolicy      = MULTIBUS,
283                 .pgfailback    = FAILBACK_UNDEF,
284                 .rr_weight     = RR_WEIGHT_NONE,
285                 .no_path_retry = 5,
286                 .checker_name  = TUR,
287                 .prio_name     = DEFAULT_PRIO,
288                 .prio_args     = NULL,
289         },
290         /*
291          * Fujitsu controller family
292          *
293          * Maintainer : Christophe Varoqui
294          * Mail : christophe.varoqui@opensvc.com
295          */
296         {
297                 .vendor        = "FSC",
298                 .product       = "CentricStor",
299                 .features      = DEFAULT_FEATURES,
300                 .hwhandler     = DEFAULT_HWHANDLER,
301                 .pgpolicy      = GROUP_BY_SERIAL,
302                 .pgfailback    = FAILBACK_UNDEF,
303                 .rr_weight     = RR_WEIGHT_NONE,
304                 .no_path_retry = NO_PATH_RETRY_UNDEF,
305                 .checker_name  = DIRECTIO,
306                 .prio_name     = DEFAULT_PRIO,
307                 .prio_args     = NULL,
308         },
309         {
310                 .vendor        = "FUJITSU",
311                 .product       = "ETERNUS_DX(L|400|8000)",
312                 .features      = "1 queue_if_no_path",
313                 .hwhandler     = DEFAULT_HWHANDLER,
314                 .pgpolicy      = GROUP_BY_PRIO,
315                 .pgfailback    = -FAILBACK_IMMEDIATE,
316                 .rr_weight     = RR_WEIGHT_NONE,
317                 .no_path_retry = 10,
318                 .checker_name  = TUR,
319                 .prio_name     = PRIO_ALUA,
320                 .prio_args     = NULL,
321         },
322         /*
323          * Hitachi controller family
324          *
325          * Maintainer : Matthias Rudolph
326          * Mail : matthias.rudolph@hds.com
327          */
328         {
329                 .vendor        = "(HITACHI|HP)",
330                 .product       = "OPEN-.*",
331                 .features      = DEFAULT_FEATURES,
332                 .hwhandler     = DEFAULT_HWHANDLER,
333                 .pgpolicy      = MULTIBUS,
334                 .pgfailback    = FAILBACK_UNDEF,
335                 .rr_weight     = RR_WEIGHT_NONE,
336                 .no_path_retry = NO_PATH_RETRY_UNDEF,
337                 .checker_name  = TUR,
338                 .prio_name     = DEFAULT_PRIO,
339                 .prio_args     = NULL,
340         },
341         {
342                 .vendor        = "HITACHI",
343                 .product       = "DF.*",
344                 .features      = "1 queue_if_no_path",
345                 .hwhandler     = DEFAULT_HWHANDLER,
346                 .pgpolicy      = GROUP_BY_PRIO,
347                 .pgfailback    = -FAILBACK_IMMEDIATE,
348                 .rr_weight     = RR_WEIGHT_NONE,
349                 .no_path_retry = NO_PATH_RETRY_UNDEF,
350                 .checker_name  = TUR,
351                 .prio_name     = PRIO_HDS,
352                 .prio_args     = NULL,
353         },
354         /*
355          * IBM controller family
356          *
357          * Maintainer : Hannes Reinecke, SuSE
358          * Mail : hare@suse.de
359          */
360         {
361                 .vendor        = "IBM",
362                 .product       = "ProFibre 4000R",
363                 .features      = DEFAULT_FEATURES,
364                 .hwhandler     = DEFAULT_HWHANDLER,
365                 .pgpolicy      = MULTIBUS,
366                 .pgfailback    = FAILBACK_UNDEF,
367                 .rr_weight     = RR_WEIGHT_NONE,
368                 .no_path_retry = NO_PATH_RETRY_UNDEF,
369                 .checker_name  = DIRECTIO,
370                 .prio_name     = DEFAULT_PRIO,
371                 .prio_args     = NULL,
372         },
373         {
374                 /* IBM FAStT 1722-600 */
375                 .vendor        = "IBM",
376                 .product       = "^1722-600",
377                 .bl_product    = "Universal Xport",
378                 .features      = "1 queue_if_no_path",
379                 .hwhandler     = "1 rdac",
380                 .pgpolicy      = GROUP_BY_PRIO,
381                 .pgfailback    = -FAILBACK_IMMEDIATE,
382                 .rr_weight     = RR_WEIGHT_NONE,
383                 .no_path_retry = 300,
384                 .checker_name  = RDAC,
385                 .prio_name     = PRIO_RDAC,
386                 .prio_args     = NULL,
387         },
388         {
389                 /* IBM DS4100 */
390                 .vendor        = "IBM",
391                 .product       = "^1724",
392                 .bl_product    = "Universal Xport",
393                 .features      = "1 queue_if_no_path",
394                 .hwhandler     = "1 rdac",
395                 .pgpolicy      = GROUP_BY_PRIO,
396                 .pgfailback    = -FAILBACK_IMMEDIATE,
397                 .rr_weight     = RR_WEIGHT_NONE,
398                 .no_path_retry = 300,
399                 .checker_name  = RDAC,
400                 .prio_name     = PRIO_RDAC,
401                 .prio_args     = NULL,
402         },
403         {
404                 /* IBM DS3200 / DS3300 / DS3400 */
405                 .vendor        = "IBM",
406                 .product       = "^1726",
407                 .bl_product    = "Universal Xport",
408                 .features      = "1 queue_if_no_path",
409                 .hwhandler     = "1 rdac",
410                 .pgpolicy      = GROUP_BY_PRIO,
411                 .pgfailback    = -FAILBACK_IMMEDIATE,
412                 .rr_weight     = RR_WEIGHT_NONE,
413                 .no_path_retry = 300,
414                 .checker_name  = RDAC,
415                 .prio_name     = PRIO_RDAC,
416                 .prio_args     = NULL,
417         },
418         {
419                 /* IBM DS4400 / DS4500 / FAStT700 */
420                 .vendor        = "IBM",
421                 .product       = "^1742",
422                 .bl_product    = "Universal Xport",
423                 .features      = DEFAULT_FEATURES,
424                 .hwhandler     = "1 rdac",
425                 .pgpolicy      = GROUP_BY_PRIO,
426                 .pgfailback    = -FAILBACK_IMMEDIATE,
427                 .rr_weight     = RR_WEIGHT_NONE,
428                 .no_path_retry = NO_PATH_RETRY_QUEUE,
429                 .checker_name  = RDAC,
430                 .prio_name     = PRIO_RDAC,
431                 .prio_args     = NULL,
432         },
433         {
434                 .vendor        = "IBM",
435                 .product       = "^1745|^1746",
436                 .bl_product    = "Universal Xport",
437                 .features      = "2 pg_init_retries 50",
438                 .hwhandler     = "1 rdac",
439                 .pgpolicy      = GROUP_BY_PRIO,
440                 .pgfailback    = -FAILBACK_IMMEDIATE,
441                 .rr_weight     = RR_WEIGHT_NONE,
442                 .no_path_retry = 15,
443                 .checker_name  = RDAC,
444                 .prio_name     = PRIO_RDAC,
445                 .prio_args     = NULL,
446         },
447         {
448             /* IBM DS4700 */
449                 .vendor        = "IBM",
450                 .product       = "^1814",
451                 .bl_product    = "Universal Xport",
452                 .features      = DEFAULT_FEATURES,
453                 .hwhandler     = "1 rdac",
454                 .pgpolicy      = GROUP_BY_PRIO,
455                 .pgfailback    = -FAILBACK_IMMEDIATE,
456                 .rr_weight     = RR_WEIGHT_NONE,
457                 .no_path_retry = NO_PATH_RETRY_QUEUE,
458                 .checker_name  = RDAC,
459                 .prio_name     = PRIO_RDAC,
460                 .prio_args     = NULL,
461         },
462         {
463             /* IBM DS4800 */
464                 .vendor        = "IBM",
465                 .product       = "^1815",
466                 .bl_product    = "Universal Xport",
467                 .features      = DEFAULT_FEATURES,
468                 .hwhandler     = "1 rdac",
469                 .pgpolicy      = GROUP_BY_PRIO,
470                 .pgfailback    = -FAILBACK_IMMEDIATE,
471                 .rr_weight     = RR_WEIGHT_NONE,
472                 .no_path_retry = NO_PATH_RETRY_QUEUE,
473                 .checker_name  = RDAC,
474                 .prio_name     = PRIO_RDAC,
475                 .prio_args     = NULL,
476         },
477         {
478             /* IBM DS5000 */
479                 .vendor        = "IBM",
480                 .product       = "^1818",
481                 .bl_product    = "Universal Xport",
482                 .features      = DEFAULT_FEATURES,
483                 .hwhandler     = "1 rdac",
484                 .pgpolicy      = GROUP_BY_PRIO,
485                 .pgfailback    = -FAILBACK_IMMEDIATE,
486                 .rr_weight     = RR_WEIGHT_NONE,
487                 .no_path_retry = NO_PATH_RETRY_QUEUE,
488                 .checker_name  = RDAC,
489                 .prio_name     = PRIO_RDAC,
490                 .prio_args     = NULL,
491         },
492         {
493                 /* IBM Netfinity Fibre Channel RAID Controller Unit */
494                 .vendor        = "IBM",
495                 .product       = "^3526",
496                 .bl_product    = "Universal Xport",
497                 .features      = DEFAULT_FEATURES,
498                 .hwhandler     = "1 rdac",
499                 .pgpolicy      = GROUP_BY_PRIO,
500                 .pgfailback    = -FAILBACK_IMMEDIATE,
501                 .rr_weight     = RR_WEIGHT_NONE,
502                 .no_path_retry = NO_PATH_RETRY_QUEUE,
503                 .checker_name  = RDAC,
504                 .prio_name     = PRIO_RDAC,
505                 .prio_args     = NULL,
506         },
507         {
508                 /* IBM DS4200 / FAStT200 */
509                 .vendor        = "IBM",
510                 .product       = "^3542",
511                 .features      = DEFAULT_FEATURES,
512                 .hwhandler     = DEFAULT_HWHANDLER,
513                 .pgpolicy      = GROUP_BY_SERIAL,
514                 .pgfailback    = FAILBACK_UNDEF,
515                 .rr_weight     = RR_WEIGHT_NONE,
516                 .no_path_retry = NO_PATH_RETRY_UNDEF,
517                 .checker_name  = TUR,
518                 .prio_name     = DEFAULT_PRIO,
519                 .prio_args     = NULL,
520         },
521         {
522                 /* IBM ESS F20 aka Shark */
523                 .vendor        = "IBM",
524                 .product       = "^2105800",
525                 .features      = "1 queue_if_no_path",
526                 .hwhandler     = DEFAULT_HWHANDLER,
527                 .pgpolicy      = GROUP_BY_SERIAL,
528                 .pgfailback    = FAILBACK_UNDEF,
529                 .rr_weight     = RR_WEIGHT_NONE,
530                 .no_path_retry = NO_PATH_RETRY_UNDEF,
531                 .checker_name  = TUR,
532                 .prio_name     = DEFAULT_PRIO,
533                 .prio_args     = NULL,
534         },
535         {
536                 /* IBM ESS F20 aka Shark */
537                 .vendor        = "IBM",
538                 .product       = "^2105F20",
539                 .features      = "1 queue_if_no_path",
540                 .hwhandler     = DEFAULT_HWHANDLER,
541                 .pgpolicy      = GROUP_BY_SERIAL,
542                 .pgfailback    = FAILBACK_UNDEF,
543                 .rr_weight     = RR_WEIGHT_NONE,
544                 .no_path_retry = NO_PATH_RETRY_UNDEF,
545                 .checker_name  = TUR,
546                 .prio_name     = DEFAULT_PRIO,
547                 .prio_args     = NULL,
548         },
549         {
550                 /* IBM DS6000 */
551                 .vendor        = "IBM",
552                 .product       = "^1750500",
553                 .features      = "1 queue_if_no_path",
554                 .hwhandler     = DEFAULT_HWHANDLER,
555                 .pgpolicy      = GROUP_BY_PRIO,
556                 .pgfailback    = -FAILBACK_IMMEDIATE,
557                 .rr_weight     = RR_WEIGHT_NONE,
558                 .no_path_retry = NO_PATH_RETRY_UNDEF,
559                 .checker_name  = TUR,
560                 .prio_name     = PRIO_ALUA,
561                 .prio_args     = NULL,
562         },
563         {
564                 /* IBM DS8000 */
565                 .vendor        = "IBM",
566                 .product       = "^2107900",
567                 .features      = "1 queue_if_no_path",
568                 .hwhandler     = DEFAULT_HWHANDLER,
569                 .pgpolicy      = MULTIBUS,
570                 .pgfailback    = FAILBACK_UNDEF,
571                 .rr_weight     = RR_WEIGHT_NONE,
572                 .no_path_retry = NO_PATH_RETRY_UNDEF,
573                 .checker_name  = TUR,
574                 .prio_name     = DEFAULT_PRIO,
575                 .prio_args     = NULL,
576         },
577         {
578                 /* IBM SAN Volume Controller */
579                 .vendor        = "IBM",
580                 .product       = "^2145",
581                 .features      = "1 queue_if_no_path",
582                 .hwhandler     = DEFAULT_HWHANDLER,
583                 .pgpolicy      = GROUP_BY_PRIO,
584                 .pgfailback    = -FAILBACK_IMMEDIATE,
585                 .rr_weight     = RR_WEIGHT_NONE,
586                 .no_path_retry = NO_PATH_RETRY_UNDEF,
587                 .checker_name  = TUR,
588                 .prio_name     = PRIO_ALUA,
589                 .prio_args     = NULL,
590         },
591         {
592                 /* IBM S/390 ECKD DASD */
593                 .vendor        = "IBM",
594                 .product       = "S/390 DASD ECKD",
595                 .bl_product       = "S/390.*",
596                 .uid_attribute = "ID_UID",
597                 .features      = "1 queue_if_no_path",
598                 .hwhandler     = DEFAULT_HWHANDLER,
599                 .pgpolicy      = MULTIBUS,
600                 .pgfailback    = FAILBACK_UNDEF,
601                 .rr_weight     = RR_WEIGHT_NONE,
602                 .no_path_retry = NO_PATH_RETRY_UNDEF,
603                 .checker_name  = DIRECTIO,
604                 .prio_name     = DEFAULT_PRIO,
605                 .prio_args     = NULL,
606         },
607         {
608                 /* IBM S/390 FBA DASD */
609                 .vendor        = "IBM",
610                 .product       = "S/390 DASD FBA",
611                 .bl_product       = "S/390.*",
612                 .uid_attribute = "ID_UID",
613                 .features      = "1 queue_if_no_path",
614                 .hwhandler     = DEFAULT_HWHANDLER,
615                 .pgpolicy      = MULTIBUS,
616                 .pgfailback    = FAILBACK_UNDEF,
617                 .rr_weight     = RR_WEIGHT_NONE,
618                 .no_path_retry = NO_PATH_RETRY_UNDEF,
619                 .checker_name  = DIRECTIO,
620                 .prio_name     = DEFAULT_PRIO,
621                 .prio_args     = NULL,
622         },
623         {
624                 /* IBM IPR */
625                 .vendor        = "IBM",
626                 .product       = "^IPR.*",
627                 .features      = "1 queue_if_no_path",
628                 .hwhandler     = "1 alua",
629                 .pgpolicy      = GROUP_BY_PRIO,
630                 .pgfailback    = -FAILBACK_IMMEDIATE,
631                 .rr_weight     = RR_WEIGHT_NONE,
632                 .no_path_retry = NO_PATH_RETRY_UNDEF,
633                 .checker_name  = TUR,
634                 .prio_name     = PRIO_ALUA,
635                 .prio_args     = NULL,
636         },
637         {
638                 /* IBM RSSM */
639                 .vendor        = "IBM",
640                 .product       = "1820N00",
641                 .features      = DEFAULT_FEATURES,
642                 .hwhandler     = DEFAULT_HWHANDLER,
643                 .pgpolicy      = GROUP_BY_PRIO,
644                 .pgfailback    = -FAILBACK_IMMEDIATE,
645                 .rr_weight     = RR_WEIGHT_NONE,
646                 .no_path_retry = NO_PATH_RETRY_QUEUE,
647                 .minio         = 100,
648                 .checker_name  = TUR,
649                 .prio_name     = PRIO_ALUA,
650                 .prio_args     = NULL,
651         },
652         {
653             /* IBM XIV Storage System */
654                 .vendor        = "IBM",
655                 .product       = "2810XIV",
656                 .features      = "1 queue_if_no_path",
657                 .hwhandler     = DEFAULT_HWHANDLER,
658                 .pgpolicy      = MULTIBUS,
659                 .pgfailback    = 15,
660                 .rr_weight     = RR_WEIGHT_NONE,
661                 .no_path_retry = NO_PATH_RETRY_UNDEF,
662                 .minio         = 15,
663                 .checker_name  = TUR,
664                 .prio_name     = DEFAULT_PRIO,
665                 .prio_args     = NULL,
666         },
667         /*
668          * IBM Power Virtual SCSI Devices
669          *
670          * Maintainer : Brian King, IBM
671          * Mail : brking@linux.vnet.ibm.com
672          */
673         {
674                 /* AIX VDASD */
675                 .vendor        = "AIX",
676                 .product       = "VDASD",
677                 .features      = DEFAULT_FEATURES,
678                 .hwhandler     = DEFAULT_HWHANDLER,
679                 .pgpolicy      = MULTIBUS,
680                 .pgfailback    = -FAILBACK_IMMEDIATE,
681                 .rr_weight     = RR_WEIGHT_NONE,
682                 .no_path_retry = (300 / DEFAULT_CHECKINT),
683                 .checker_name  = DIRECTIO,
684                 .prio_name     = DEFAULT_PRIO,
685                 .prio_args     = NULL,
686         },
687         {
688                 /* IBM 3303      NVDISK */
689                 .vendor        = "IBM",
690                 .product       = "3303      NVDISK",
691                 .features      = DEFAULT_FEATURES,
692                 .hwhandler     = DEFAULT_HWHANDLER,
693                 .pgpolicy      = FAILOVER,
694                 .pgfailback    = -FAILBACK_IMMEDIATE,
695                 .rr_weight     = RR_WEIGHT_NONE,
696                 .no_path_retry = (300 / DEFAULT_CHECKINT),
697                 .checker_name  = TUR,
698                 .prio_name     = DEFAULT_PRIO,
699                 .prio_args     = NULL,
700         },
701         {
702                 /* AIX NVDISK */
703                 .vendor        = "AIX",
704                 .product       = "NVDISK",
705                 .features      = DEFAULT_FEATURES,
706                 .hwhandler     = "1 alua",
707                 .pgpolicy      = GROUP_BY_PRIO,
708                 .pgfailback    = -FAILBACK_IMMEDIATE,
709                 .rr_weight     = RR_WEIGHT_NONE,
710                 .no_path_retry = (300 / DEFAULT_CHECKINT),
711                 .checker_name  = TUR,
712                 .prio_name     = PRIO_ALUA,
713                 .prio_args     = NULL,
714         },
715         {
716                 /* DELL MD3000 */
717                 .vendor        = "DELL",
718                 .product       = "MD3000",
719                 .bl_product    = "Universal Xport",
720                 .features      = "2 pg_init_retries 50",
721                 .hwhandler     = "1 rdac",
722                 .pgpolicy      = GROUP_BY_PRIO,
723                 .pgfailback    = -FAILBACK_IMMEDIATE,
724                 .rr_weight     = RR_WEIGHT_NONE,
725                 .no_path_retry = 15,
726                 .checker_name  = RDAC,
727                 .prio_name     = PRIO_RDAC,
728                 .prio_args     = NULL,
729         },
730         {
731                 /* DELL MD3000i */
732                 .vendor        = "DELL",
733                 .product       = "MD3000i",
734                 .bl_product    = "Universal Xport",
735                 .features      = "2 pg_init_retries 50",
736                 .hwhandler     = "1 rdac",
737                 .pgpolicy      = GROUP_BY_PRIO,
738                 .pgfailback    = -FAILBACK_IMMEDIATE,
739                 .rr_weight     = RR_WEIGHT_NONE,
740                 .no_path_retry = 15,
741                 .checker_name  = RDAC,
742                 .prio_name     = PRIO_RDAC,
743                 .prio_args     = NULL,
744         },
745         {
746                 /* DELL MD32xx */
747                 .vendor        = "DELL",
748                 .product       = "MD32xx",
749                 .bl_product    = "Universal Xport",
750                 .features      = "2 pg_init_retries 50",
751                 .hwhandler     = "1 rdac",
752                 .pgpolicy      = GROUP_BY_PRIO,
753                 .pgfailback    = -FAILBACK_IMMEDIATE,
754                 .rr_weight     = RR_WEIGHT_NONE,
755                 .no_path_retry = 15,
756                 .checker_name  = RDAC,
757                 .prio_name     = PRIO_RDAC,
758                 .prio_args     = NULL,
759         },
760         {
761                 /* DELL MD32xxi */
762                 .vendor        = "DELL",
763                 .product       = "MD32xxi",
764                 .bl_product    = "Universal Xport",
765                 .features      = "2 pg_init_retries 50",
766                 .hwhandler     = "1 rdac",
767                 .pgpolicy      = GROUP_BY_PRIO,
768                 .pgfailback    = -FAILBACK_IMMEDIATE,
769                 .rr_weight     = RR_WEIGHT_NONE,
770                 .no_path_retry = 15,
771                 .checker_name  = RDAC,
772                 .prio_name     = PRIO_RDAC,
773                 .prio_args     = NULL,
774         },
775         /*
776          * NETAPP controller family
777          *
778          * Maintainer : Dave Wysochanski
779          * Mail : davidw@netapp.com
780          */
781         {
782                 .vendor        = "NETAPP",
783                 .product       = "LUN.*",
784                 .features      = "3 queue_if_no_path pg_init_retries 50",
785                 .hwhandler     = DEFAULT_HWHANDLER,
786                 .pgpolicy      = GROUP_BY_PRIO,
787                 .pgfailback    = -FAILBACK_IMMEDIATE,
788                 .flush_on_last_del = FLUSH_ENABLED,
789                 .rr_weight     = RR_WEIGHT_NONE,
790                 .no_path_retry = NO_PATH_RETRY_UNDEF,
791                 .minio         = 128,
792                 .dev_loss      = MAX_DEV_LOSS_TMO,
793                 .checker_name  = TUR,
794                 .prio_name     = PRIO_ONTAP,
795                 .prio_args     = NULL,
796                 .retain_hwhandler = RETAIN_HWHANDLER_ON,
797                 .user_friendly_names = USER_FRIENDLY_NAMES_OFF,
798                 .detect_prio   = DETECT_PRIO_ON,
799         },
800         /*
801          * NEXENTA/COMSTAR controller family
802          *
803          * Maintainer : Yacine Kheddache
804          * Mail : yacine@alyseo.com
805          */
806         {
807                 .vendor        = "NEXENTA",
808                 .product       = "COMSTAR",
809                 .features      = "1 queue_if_no_path",
810                 .hwhandler     = DEFAULT_HWHANDLER,
811                 .pgpolicy      = GROUP_BY_SERIAL,
812                 .pgfailback    = -FAILBACK_IMMEDIATE,
813                 .rr_weight     = RR_WEIGHT_NONE,
814                 .no_path_retry = 30,
815                 .minio         = 128,
816                 .checker_name  = DIRECTIO,
817                 .prio_name     = DEFAULT_PRIO,
818                 .prio_args     = NULL,
819         },
820         /*
821          * IBM NSeries (NETAPP) controller family
822          *
823          * Maintainer : Dave Wysochanski
824          * Mail : davidw@netapp.com
825          */
826         {
827                 .vendor        = "IBM",
828                 .product       = "Nseries.*",
829                 .features      = "1 queue_if_no_path",
830                 .hwhandler     = DEFAULT_HWHANDLER,
831                 .pgpolicy      = GROUP_BY_PRIO,
832                 .pgfailback    = -FAILBACK_IMMEDIATE,
833                 .rr_weight     = RR_WEIGHT_NONE,
834                 .no_path_retry = NO_PATH_RETRY_UNDEF,
835                 .minio         = 128,
836                 .checker_name  = DIRECTIO,
837                 .prio_name     = PRIO_ONTAP,
838                 .prio_args     = NULL,
839         },
840         /*
841          * Pillar Data controller family
842          *
843          * Maintainer : Srinivasan Ramani
844          * Mail : sramani@pillardata.com
845          */
846         {
847                 .vendor        = "Pillar",
848                 .product       = "Axiom.*",
849                 .features      = DEFAULT_FEATURES,
850                 .hwhandler     = DEFAULT_HWHANDLER,
851                 .pgpolicy      = GROUP_BY_PRIO,
852                 .pgfailback    = FAILBACK_UNDEF,
853                 .rr_weight     = RR_WEIGHT_NONE,
854                 .no_path_retry = NO_PATH_RETRY_UNDEF,
855                 .checker_name  = TUR,
856                 .prio_name     = PRIO_ALUA,
857                 .prio_args     = NULL,
858         },
859
860         /*
861          * SGI arrays
862          *
863          * Maintainer : Christophe Varoqui
864          * Mail : christophe.varoqui@opensvc.com
865          */
866         {
867                 .vendor        = "SGI",
868                 .product       = "TP9[13]00",
869                 .features      = DEFAULT_FEATURES,
870                 .hwhandler     = DEFAULT_HWHANDLER,
871                 .pgpolicy      = MULTIBUS,
872                 .pgfailback    = FAILBACK_UNDEF,
873                 .rr_weight     = RR_WEIGHT_NONE,
874                 .no_path_retry = NO_PATH_RETRY_UNDEF,
875                 .checker_name  = DIRECTIO,
876                 .prio_name     = DEFAULT_PRIO,
877                 .prio_args     = NULL,
878         },
879         {
880                 .vendor        = "SGI",
881                 .product       = "TP9[45]00",
882                 .bl_product    = "Universal Xport",
883                 .features      = DEFAULT_FEATURES,
884                 .hwhandler     = "1 rdac",
885                 .pgpolicy      = GROUP_BY_PRIO,
886                 .pgfailback    = -FAILBACK_IMMEDIATE,
887                 .rr_weight     = RR_WEIGHT_NONE,
888                 .no_path_retry = NO_PATH_RETRY_QUEUE,
889                 .checker_name  = RDAC,
890                 .prio_name     = PRIO_RDAC,
891                 .prio_args     = NULL,
892         },
893         {
894                 .vendor        = "SGI",
895                 .product       = "IS.*",
896                 .bl_product    = "Universal Xport",
897                 .features      = "2 pg_init_retries 50",
898                 .hwhandler     = "1 rdac",
899                 .pgpolicy      = GROUP_BY_PRIO,
900                 .pgfailback    = -FAILBACK_IMMEDIATE,
901                 .rr_weight     = RR_WEIGHT_NONE,
902                 .no_path_retry = 15,
903                 .checker_name  = RDAC,
904                 .prio_name     = PRIO_RDAC,
905                 .prio_args     = NULL,
906         },
907         /* NEC Storage M Series */
908         {
909                 .vendor        = "NEC",
910                 .product       = "DISK ARRAY",
911                 .features      = DEFAULT_FEATURES,
912                 .hwhandler     = "1 alua",
913                 .pgpolicy      = GROUP_BY_PRIO,
914                 .pgfailback    = -FAILBACK_IMMEDIATE,
915                 .rr_weight     = RR_WEIGHT_NONE,
916                 .no_path_retry = NO_PATH_RETRY_UNDEF,
917                 .checker_name  = TUR,
918                 .prio_name     = PRIO_ALUA,
919                 .prio_args     = NULL,
920         },
921         /*
922          * STK arrays
923          *
924          * Maintainer : Christophe Varoqui
925          * Mail : christophe.varoqui@opensvc.com
926          */
927         {
928                 .vendor        = "STK",
929                 .product       = "OPENstorage D280",
930                 .bl_product    = "Universal Xport",
931                 .features      = DEFAULT_FEATURES,
932                 .hwhandler     = "1 rdac",
933                 .pgpolicy      = GROUP_BY_PRIO,
934                 .pgfailback    = -FAILBACK_IMMEDIATE,
935                 .rr_weight     = RR_WEIGHT_NONE,
936                 .no_path_retry = NO_PATH_RETRY_UNDEF,
937                 .checker_name  = TUR,
938                 .prio_name     = PRIO_RDAC,
939                 .prio_args     = NULL,
940         },
941         /*
942          * SUN arrays
943          *
944          * Maintainer : Christophe Varoqui
945          * Mail : christophe.varoqui@opensvc.com
946          */
947         {
948                 .vendor        = "SUN",
949                 .product       = "(StorEdge 3510|T4)",
950                 .features      = DEFAULT_FEATURES,
951                 .hwhandler     = DEFAULT_HWHANDLER,
952                 .pgpolicy      = MULTIBUS,
953                 .pgfailback    = FAILBACK_UNDEF,
954                 .rr_weight     = RR_WEIGHT_NONE,
955                 .no_path_retry = NO_PATH_RETRY_UNDEF,
956                 .checker_name  = DIRECTIO,
957                 .prio_name     = DEFAULT_PRIO,
958                 .prio_args     = NULL,
959         },
960         {
961                 .vendor        = "SUN",
962                 .product       = "STK6580_6780",
963                 .features      = DEFAULT_FEATURES,
964                 .hwhandler     = "1 rdac",
965                 .pgpolicy      = GROUP_BY_PRIO,
966                 .pgfailback    = -FAILBACK_IMMEDIATE,
967                 .rr_weight     = RR_WEIGHT_NONE,
968                 .no_path_retry = NO_PATH_RETRY_UNDEF,
969                 .checker_name  = TUR,
970                 .prio_name     = PRIO_RDAC,
971                 .prio_args     = NULL,
972         },
973         {
974                 .vendor        = "EUROLOGC",
975                 .product       = "FC2502",
976                 .features      = DEFAULT_FEATURES,
977                 .hwhandler     = DEFAULT_HWHANDLER,
978                 .pgpolicy      = GROUP_BY_PRIO,
979                 .pgfailback    = FAILBACK_UNDEF,
980                 .rr_weight     = RR_WEIGHT_NONE,
981                 .no_path_retry = NO_PATH_RETRY_UNDEF,
982                 .checker_name  = DEFAULT_CHECKER,
983                 .prio_name     = DEFAULT_PRIO,
984                 .prio_args     = NULL,
985         },
986         /*
987          * Pivot3 RAIGE
988          *
989          * Maintainer : Bart Brooks, Pivot3
990          * Mail : bartb@pivot3.com
991          */
992         {
993                 .vendor        = "PIVOT3",
994                 .product       = "RAIGE VOLUME",
995                 .features      = "1 queue_if_no_path",
996                 .hwhandler     = DEFAULT_HWHANDLER,
997                 .pgpolicy      = MULTIBUS,
998                 .pgfailback    = FAILBACK_UNDEF,
999                 .rr_weight     = RR_WEIGHT_NONE,
1000                 .no_path_retry = NO_PATH_RETRY_UNDEF,
1001                 .minio         = 100,
1002                 .checker_name  = TUR,
1003                 .prio_name     = DEFAULT_PRIO,
1004                 .prio_args     = NULL,
1005         },
1006         {
1007                 .vendor        = "SUN",
1008                 .product       = "CSM200_R",
1009                 .bl_product    = "Universal Xport",
1010                 .features      = DEFAULT_FEATURES,
1011                 .hwhandler     = "1 rdac",
1012                 .pgpolicy      = GROUP_BY_PRIO,
1013                 .pgfailback    = -FAILBACK_IMMEDIATE,
1014                 .rr_weight     = RR_WEIGHT_NONE,
1015                 .no_path_retry = NO_PATH_RETRY_QUEUE,
1016                 .checker_name  = RDAC,
1017                 .prio_name     = PRIO_RDAC,
1018                 .prio_args     = NULL,
1019         },
1020         /* SUN/LSI 2510, 2540, 2530, 2540 */
1021         {
1022                 .vendor        = "SUN",
1023                 .product       = "LCSM100_[IEFS]",
1024                 .bl_product    = "Universal Xport",
1025                 .features      = DEFAULT_FEATURES,
1026                 .hwhandler     = "1 rdac",
1027                 .pgpolicy      = GROUP_BY_PRIO,
1028                 .pgfailback    = -FAILBACK_IMMEDIATE,
1029                 .rr_weight     = RR_WEIGHT_NONE,
1030                 .no_path_retry = NO_PATH_RETRY_QUEUE,
1031                 .checker_name  = RDAC,
1032                 .prio_name     = PRIO_RDAC,
1033                 .prio_args     = NULL,
1034         },
1035         /* StorageTek 6180 */
1036         {
1037                 .vendor        = "SUN",
1038                 .product       = "SUN_6180",
1039                 .features      = DEFAULT_FEATURES,
1040                 .hwhandler     = "1 rdac",
1041                 .pgpolicy      = GROUP_BY_PRIO,
1042                 .pgfailback    = -FAILBACK_IMMEDIATE,
1043                 .rr_weight     = RR_WEIGHT_NONE,
1044                 .no_path_retry = NO_PATH_RETRY_QUEUE,
1045                 .minio         = DEFAULT_MINIO,
1046                 .minio_rq      = DEFAULT_MINIO_RQ,
1047                 .checker_name  = RDAC,
1048                 .prio_name     = PRIO_RDAC,
1049         },
1050         /* LSI/Engenio/NetApp E-Series RDAC storage
1051          *
1052          * Maintainer : Sean Stewart
1053          * Mail : sean.stewart@netapp.com
1054          */
1055         {
1056                 .vendor        = "(NETAPP|LSI|ENGENIO)",
1057                 .product       = "INF-01-00",
1058                 .bl_product    = "Universal Xport",
1059                 .features      = "2 pg_init_retries 50",
1060                 .hwhandler     = "1 rdac",
1061                 .pgpolicy      = GROUP_BY_PRIO,
1062                 .pgfailback    = -FAILBACK_IMMEDIATE,
1063                 .rr_weight     = RR_WEIGHT_NONE,
1064                 .no_path_retry = 30,
1065                 .checker_name  = RDAC,
1066                 .prio_name     = PRIO_RDAC,
1067                 .prio_args     = NULL,
1068                 .detect_prio   = DETECT_PRIO_ON,
1069                 .retain_hwhandler = RETAIN_HWHANDLER_ON,
1070         },
1071         {
1072                 .vendor        = "STK",
1073                 .product       = "FLEXLINE 380",
1074                 .bl_product    = "Universal Xport",
1075                 .features      = DEFAULT_FEATURES,
1076                 .hwhandler     = "1 rdac",
1077                 .pgpolicy      = GROUP_BY_PRIO,
1078                 .pgfailback    = -FAILBACK_IMMEDIATE,
1079                 .rr_weight     = RR_WEIGHT_NONE,
1080                 .no_path_retry = NO_PATH_RETRY_QUEUE,
1081                 .checker_name  = RDAC,
1082                 .prio_name     = PRIO_RDAC,
1083                 .prio_args     = NULL,
1084         },
1085         {
1086                 .vendor        = "Intel",
1087                 .product       = "Multi-Flex",
1088                 .features      = DEFAULT_FEATURES,
1089                 .hwhandler     = "1 alua",
1090                 .pgpolicy      = GROUP_BY_PRIO,
1091                 .pgfailback    = -FAILBACK_IMMEDIATE,
1092                 .rr_weight     = RR_WEIGHT_NONE,
1093                 .no_path_retry = NO_PATH_RETRY_QUEUE,
1094                 .checker_name  = TUR,
1095                 .prio_name     = PRIO_ALUA,
1096                 .prio_args     = NULL,
1097         },
1098         {
1099                 .vendor        = "DataCore",
1100                 .product       = "SANmelody",
1101                 .features      = DEFAULT_FEATURES,
1102                 .hwhandler     = DEFAULT_HWHANDLER,
1103                 .pgpolicy      = GROUP_BY_PRIO,
1104                 .pgfailback    = -FAILBACK_IMMEDIATE,
1105                 .rr_weight     = RR_WEIGHT_NONE,
1106                 .no_path_retry = NO_PATH_RETRY_QUEUE,
1107                 .checker_name  = TUR,
1108                 .prio_name     = PRIO_ALUA,
1109                 .prio_args     = NULL,
1110         },
1111         {
1112                 .vendor        = "DataCore",
1113                 .product       = "Virtual Disk",
1114                 .features      = DEFAULT_FEATURES,
1115                 .hwhandler     = DEFAULT_HWHANDLER,
1116                 .pgpolicy      = GROUP_BY_PRIO,
1117                 .pgfailback    = -FAILBACK_IMMEDIATE,
1118                 .rr_weight     = RR_WEIGHT_NONE,
1119                 .no_path_retry = NO_PATH_RETRY_QUEUE,
1120                 .checker_name  = TUR,
1121                 .prio_name     = PRIO_ALUA,
1122                 .prio_args     = NULL,
1123         },
1124         /*
1125          * EOL
1126          */
1127         {
1128                 .vendor        = NULL,
1129                 .product       = NULL,
1130                 .features      = NULL,
1131                 .hwhandler     = NULL,
1132                 .selector      = NULL,
1133                 .pgpolicy      = 0,
1134                 .pgfailback    = 0,
1135                 .rr_weight     = 0,
1136                 .no_path_retry = 0,
1137                 .minio         = 0,
1138                 .minio_rq      = 0,
1139                 .checker_name  = NULL,
1140                 .prio_name     = NULL,
1141                 .prio_args     = NULL,
1142         },
1143 };
1144
1145 extern int
1146 setup_default_hwtable (vector hw)
1147 {
1148         int r = 0;
1149         struct hwentry * hwe = default_hw;
1150
1151         while (hwe->vendor) {
1152                 r += store_hwe(hw, hwe);
1153                 hwe++;
1154         }
1155         return r;
1156 }