ca217e65b9a6cb88e6e86d2a9122def755944c9b
[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 #include "hwtable.h"
11
12 /*
13  * Tuning suggestions on these parameters should go to
14  * dm-devel@redhat.com (subscribers-only, see README)
15  *
16  * You are welcome to claim maintainership over a controller
17  * family. Please mail the currently enlisted maintainer and
18  * the upstream package maintainer.
19  *
20  * Please, use the TEMPLATE below to add new hardware.
21  *
22  * WARNING:
23  *
24  * Devices with a proprietary handler must also be included in
25  * the kernel side. Currently at drivers/scsi/scsi_dh.c
26  *
27  * Moreover, if a device needs a special treatment by the SCSI
28  * subsystem it should be included in drivers/scsi/scsi_devinfo.c
29  */
30
31 #if 0
32         /*
33          * Copy this TEMPLATE to add new hardware.
34          *
35          * Keep only mandatory(.vendor and .product) and modified attributes.
36          * Attributes with default values must be removed.
37          * .vendor, .product, .revision and .bl_product are POSIX Extended regex.
38          *
39          * COMPANY_NAME
40          *
41          * Maintainer: NAME <email>
42          */
43         {
44                 /* Product Name */
45                 .vendor        = "VENDOR",
46                 .product       = "PRODUCT",
47                 .revision      = "REVISION",
48                 .bl_product    = "BL_PRODUCT",
49                 .pgpolicy      = FAILOVER,
50                 .uid_attribute = "ID_SERIAL",
51                 .selector      = "service-time 0",
52                 .checker_name  = TUR,
53                 .alias_prefix  = "mpath",
54                 .features      = "0",
55                 .hwhandler     = "0",
56                 .prio_name     = PRIO_CONST,
57                 .prio_args     = "",
58                 .pgfailback    = -FAILBACK_MANUAL,
59                 .rr_weight     = RR_WEIGHT_NONE,
60                 .no_path_retry = NO_PATH_RETRY_UNDEF,
61                 .minio         = 1000,
62                 .minio_rq      = 1,
63                 .flush_on_last_del = FLUSH_DISABLED,
64                 .user_friendly_names = USER_FRIENDLY_NAMES_OFF,
65                 .fast_io_fail  = 5,
66                 .dev_loss      = 600,
67                 .retain_hwhandler = RETAIN_HWHANDLER_ON,
68                 .detect_prio   = DETECT_PRIO_ON,
69                 .detect_checker = DETECT_CHECKER_ON,
70                 .deferred_remove = DEFERRED_REMOVE_OFF,
71                 .delay_watch_checks = DELAY_CHECKS_OFF,
72                 .delay_wait_checks = DELAY_CHECKS_OFF,
73                 .skip_kpartx   = SKIP_KPARTX_OFF,
74                 .max_sectors_kb = MAX_SECTORS_KB_UNDEF,
75                 .ghost_delay   = GHOST_DELAY_OFF,
76         },
77 #endif
78
79 static struct hwentry default_hw[] = {
80         /*
81          * Generic NVMe devices
82          *
83          * Due to the parsing logic in find_hwe(), generic entries
84          * have to be put on top of this list, and more specific ones
85          * below.
86          */
87         {
88                 /* Generic NVMe */
89                 .vendor        = "NVME",
90                 .product       = ".*",
91                 .uid_attribute = DEFAULT_NVME_UID_ATTRIBUTE,
92                 .checker_name  = NONE,
93                 .retain_hwhandler = RETAIN_HWHANDLER_OFF,
94         },
95         /*
96          * Apple
97          *
98          * Maintainer: Shyam Sundar <g.shyamsundar@yahoo.co.in>
99          */
100         {
101                 /* Xserve RAID */
102                 .vendor        = "APPLE",
103                 .product       = "Xserve RAID",
104                 .pgpolicy      = MULTIBUS,
105         },
106         /*
107          * HPE
108          */
109         {
110                 /* 3PAR */
111                 .vendor        = "3PARdata",
112                 .product       = "VV",
113                 .pgpolicy      = GROUP_BY_PRIO,
114                 .pgfailback    = -FAILBACK_IMMEDIATE,
115                 .hwhandler     = "1 alua",
116                 .prio_name     = PRIO_ALUA,
117                 .no_path_retry = 18,
118                 .fast_io_fail  = 10,
119                 .dev_loss      = MAX_DEV_LOSS_TMO,
120         },
121         {
122                 /* RA8000 / ESA12000 */
123                 .vendor        = "DEC",
124                 .product       = "HSG80",
125                 .no_path_retry = NO_PATH_RETRY_QUEUE,
126                 .hwhandler     = "1 hp_sw",
127                 .pgpolicy      = GROUP_BY_PRIO,
128                 .checker_name  = HP_SW,
129                 .prio_name     = PRIO_HP_SW,
130         },
131         {
132                 /* VIRTUAL ARRAY 7400 */
133                 .vendor        = "HP",
134                 .product       = "A6189A",
135                 .pgpolicy      = MULTIBUS,
136                 .no_path_retry = 12,
137         },
138         {
139                 /* MSA 1000/1500 and EVA 3000/5000, with old firmware */
140                 .vendor        = "(COMPAQ|HP)",
141                 .product       = "(MSA|HSV)1[01]0",
142                 .hwhandler     = "1 hp_sw",
143                 .pgpolicy      = GROUP_BY_PRIO,
144                 .no_path_retry = 12,
145                 .checker_name  = HP_SW,
146                 .prio_name     = PRIO_HP_SW,
147         },
148         {
149                 /* MSA 1000/1500 with new firmware */
150                 .vendor        = "(COMPAQ|HP)",
151                 .product       = "MSA VOLUME",
152                 .pgpolicy      = GROUP_BY_PRIO,
153                 .pgfailback    = -FAILBACK_IMMEDIATE,
154                 .no_path_retry = 12,
155                 .prio_name     = PRIO_ALUA,
156         },
157         {
158                 /* EVA 3000/5000 with new firmware, EVA 4000/6000/8000 */
159                 .vendor        = "(COMPAQ|HP)",
160                 .product       = "(HSV1[01]1|HSV2[01]0|HSV3[046]0|HSV4[05]0)",
161                 .pgpolicy      = GROUP_BY_PRIO,
162                 .pgfailback    = -FAILBACK_IMMEDIATE,
163                 .no_path_retry = 12,
164                 .prio_name     = PRIO_ALUA,
165         },
166         {
167                 /* MSA2000 family with old firmware */
168                 .vendor        = "HP",
169                 .product       = "(MSA2[02]12fc|MSA2012i)",
170                 .pgpolicy      = MULTIBUS,
171                 .no_path_retry = 18,
172         },
173         {
174                 /* MSA2000 family with new firmware */
175                 .vendor        = "HP",
176                 .product       = "(MSA2012sa|MSA23(12|24)(fc|i|sa)|MSA2000s VOLUME)",
177                 .pgpolicy      = GROUP_BY_PRIO,
178                 .pgfailback    = -FAILBACK_IMMEDIATE,
179                 .no_path_retry = 18,
180                 .prio_name     = PRIO_ALUA,
181         },
182         {
183                 /* MSA 1040, 1050, 2040 and 2050 families */
184                 .vendor        = "HP",
185                 .product       = "MSA [12]0[45]0 SA[NS]",
186                 .pgpolicy      = GROUP_BY_PRIO,
187                 .pgfailback    = -FAILBACK_IMMEDIATE,
188                 .no_path_retry = 18,
189                 .prio_name     = PRIO_ALUA,
190         },
191         {
192                 /* SAN Virtualization Services Platform */
193                 .vendor        = "HP",
194                 .product       = "HSVX700",
195                 .hwhandler     = "1 alua",
196                 .pgpolicy      = GROUP_BY_PRIO,
197                 .pgfailback    = -FAILBACK_IMMEDIATE,
198                 .no_path_retry = 12,
199                 .prio_name     = PRIO_ALUA,
200         },
201         {
202                 /* Smart Array */
203                 .vendor        = "HP",
204                 .product       = "LOGICAL VOLUME",
205                 .pgpolicy      = MULTIBUS,
206                 .no_path_retry = 12,
207         },
208         {
209                 /* P2000 family */
210                 .vendor        = "HP",
211                 .product       = "(P2000 G3 FC|P2000G3 FC/iSCSI|P2000 G3 SAS|P2000 G3 iSCSI)",
212                 .pgpolicy      = GROUP_BY_PRIO,
213                 .pgfailback    = -FAILBACK_IMMEDIATE,
214                 .no_path_retry = 18,
215                 .prio_name     = PRIO_ALUA,
216         },
217         {
218                 /* StoreVirtual 4000 and 3200 families */
219                 .vendor        = "LEFTHAND",
220                 .product       = "(P4000|iSCSIDisk|FCDISK)",
221                 .pgpolicy      = GROUP_BY_PRIO,
222                 .pgfailback    = -FAILBACK_IMMEDIATE,
223                 .no_path_retry = 18,
224                 .prio_name     = PRIO_ALUA,
225         },
226         {
227                 /* Nimble Storage */
228                 .vendor        = "Nimble",
229                 .product       = "Server",
230                 .hwhandler     = "1 alua",
231                 .pgpolicy      = GROUP_BY_PRIO,
232                 .pgfailback    = -FAILBACK_IMMEDIATE,
233                 .prio_name     = PRIO_ALUA,
234                 .no_path_retry = NO_PATH_RETRY_QUEUE,
235         },
236                 /* SGI */
237         {
238                 /* Total Performance 9100 */
239                 .vendor        = "SGI",
240                 .product       = "TP9100",
241                 .pgpolicy      = MULTIBUS,
242         },
243         {
244                 /* Total Performance family */
245                 .vendor        = "SGI",
246                 .product       = "TP9[3457]00",
247                 .bl_product    = "Universal Xport",
248                 .pgpolicy      = GROUP_BY_PRIO,
249                 .checker_name  = RDAC,
250                 .features      = "2 pg_init_retries 50",
251                 .hwhandler     = "1 rdac",
252                 .prio_name     = PRIO_RDAC,
253                 .pgfailback    = -FAILBACK_IMMEDIATE,
254                 .no_path_retry = 30,
255         },
256         {
257                 /* (RDAC) InfiniteStorage */
258                 .vendor        = "SGI",
259                 .product       = "IS",
260                 .bl_product    = "Universal Xport",
261                 .pgpolicy      = GROUP_BY_PRIO,
262                 .checker_name  = RDAC,
263                 .features      = "2 pg_init_retries 50",
264                 .hwhandler     = "1 rdac",
265                 .prio_name     = PRIO_RDAC,
266                 .pgfailback    = -FAILBACK_IMMEDIATE,
267                 .no_path_retry = 30,
268         },
269         {
270                 /* (DDN) InfiniteStorage */
271                 .vendor        = "SGI",
272                 .product       = "^DD[46]A-",
273                 .pgpolicy      = GROUP_BY_PRIO,
274                 .pgfailback    = -FAILBACK_IMMEDIATE,
275                 .prio_name     = PRIO_ALUA,
276                 .no_path_retry = 30,
277         },
278         /*
279          * DataDirect Networks
280          */
281         {
282                 /* SAN DataDirector */
283                 .vendor        = "DDN",
284                 .product       = "SAN DataDirector",
285                 .pgpolicy      = MULTIBUS,
286         },
287         {
288                 /* EF3010 */
289                 .vendor        = "DDN",
290                 .product       = "^EF3010",
291                 .pgpolicy      = MULTIBUS,
292                 .no_path_retry = 30,
293         },
294         {
295                 /* EF3015 / S2A and SFA families */
296                 .vendor        = "DDN",
297                 .product       = "^(EF3015|S2A|SFA)",
298                 .pgpolicy      = GROUP_BY_PRIO,
299                 .pgfailback    = -FAILBACK_IMMEDIATE,
300                 .prio_name     = PRIO_ALUA,
301                 .no_path_retry = 30,
302         },
303         /*
304          * Dell EMC
305          */
306         {
307                 /* Symmetrix / DMX / VMAX / PowerMax */
308                 .vendor        = "EMC",
309                 .product       = "SYMMETRIX",
310                 .pgpolicy      = MULTIBUS,
311                 .no_path_retry = 6,
312         },
313         {
314                 /* DGC CLARiiON CX/AX / VNX and Unity */
315                 .vendor        = "^DGC",
316                 .product       = "^(RAID|DISK|VRAID)",
317                 .bl_product    = "LUNZ",
318                 .hwhandler     = "1 emc",
319                 .pgpolicy      = GROUP_BY_PRIO,
320                 .pgfailback    = -FAILBACK_IMMEDIATE,
321                 .no_path_retry = (300 / DEFAULT_CHECKINT),
322                 .checker_name  = EMC_CLARIION,
323                 .prio_name     = PRIO_EMC,
324         },
325         {
326                 /* Invista / VPLEX */
327                 .vendor        = "EMC",
328                 .product       = "Invista",
329                 .bl_product    = "LUNZ",
330                 .pgpolicy      = MULTIBUS,
331                 .no_path_retry = 5,
332         },
333         {
334                 /* XtremIO */
335                 .vendor        = "XtremIO",
336                 .product       = "XtremApp",
337                 .pgpolicy      = MULTIBUS,
338         },
339         {
340                 /*
341                  * SC Series, formerly Compellent
342                  *
343                  * Maintainer: Sean McGinnis <sean_mcginnis@dell.com>
344                  */
345                 .vendor        = "COMPELNT",
346                 .product       = "Compellent Vol",
347                 .pgpolicy      = MULTIBUS,
348                 .no_path_retry = NO_PATH_RETRY_QUEUE,
349         },
350         {
351                 /* MD Series */
352                 .vendor        = "DELL",
353                 .product       = "^MD3",
354                 .bl_product    = "Universal Xport",
355                 .pgpolicy      = GROUP_BY_PRIO,
356                 .checker_name  = RDAC,
357                 .features      = "2 pg_init_retries 50",
358                 .hwhandler     = "1 rdac",
359                 .prio_name     = PRIO_RDAC,
360                 .pgfailback    = -FAILBACK_IMMEDIATE,
361                 .no_path_retry = 30,
362         },
363         {
364                 /* EMC PowerMax NVMe */
365                 .vendor        = "NVME",
366                 .product       = "^EMC PowerMax_",
367                 .pgpolicy      = MULTIBUS,
368         },
369         /*
370          * Fujitsu
371          */
372         {
373                 /* CentricStor Virtual Tape */
374                 .vendor        = "FSC",
375                 .product       = "CentricStor",
376                 .pgpolicy      = GROUP_BY_SERIAL,
377         },
378         {
379                 /* ETERNUS family */
380                 .vendor        = "FUJITSU",
381                 .product       = "ETERNUS_DX(H|L|M|400|8000)",
382                 .pgpolicy      = GROUP_BY_PRIO,
383                 .pgfailback    = -FAILBACK_IMMEDIATE,
384                 .no_path_retry = 10,
385                 .prio_name     = PRIO_ALUA,
386         },
387         {
388                 /* FibreCAT S80 */
389                 .vendor        = "(EUROLOGC|EuroLogc)",
390                 .product       = "FC2502",
391                 .pgpolicy      = MULTIBUS,
392         },
393         {
394                 /* ETERNUS 2000, 3000 and 4000 */
395                 .vendor        = "FUJITSU",
396                 .product       = "E[234]000",
397                 .pgpolicy      = GROUP_BY_PRIO,
398                 .pgfailback    = -FAILBACK_IMMEDIATE,
399                 .no_path_retry = 10,
400                 .prio_name     = PRIO_ALUA,
401         },
402         {
403                 /* ETERNUS 6000 and 8000 */
404                 .vendor        = "FUJITSU",
405                 .product       = "E[68]000",
406                 .pgpolicy      = MULTIBUS,
407                 .no_path_retry = 10,
408         },
409         /*
410          * Hitachi Vantara
411          *
412          * Maintainer: Matthias Rudolph <Matthias.Rudolph@hitachivantara.com>
413          */
414         {
415                 /* USP-V, HUS VM, VSP, VSP G1X00 and VSP GX00 families / HP XP */
416                 .vendor        = "(HITACHI|HP)",
417                 .product       = "^OPEN-",
418                 .pgpolicy      = MULTIBUS,
419         },
420         {
421                 /* AMS other than AMS 2000 */
422                 .vendor        = "HITACHI",
423                 .product       = "^DF",
424                 .no_path_retry = NO_PATH_RETRY_QUEUE,
425                 .pgpolicy      = GROUP_BY_PRIO,
426                 .pgfailback    = -FAILBACK_IMMEDIATE,
427                 .prio_name     = PRIO_HDS,
428         },
429         {
430                 /* AMS 2000 and HUS 100 families */
431                 .vendor        = "HITACHI",
432                 .product       = "^DF600F",
433                 .pgpolicy      = MULTIBUS,
434         },
435         /*
436          * IBM
437          *
438          * Maintainer: Hannes Reinecke <hare@suse.de>
439          */
440         {
441                 /* ProFibre 4000R */
442                 .vendor        = "IBM",
443                 .product       = "ProFibre 4000R",
444                 .pgpolicy      = MULTIBUS,
445         },
446         {
447                 /* DS4300 / FAStT600 */
448                 .vendor        = "IBM",
449                 .product       = "^1722-600",
450                 .bl_product    = "Universal Xport",
451                 .pgpolicy      = GROUP_BY_PRIO,
452                 .checker_name  = RDAC,
453                 .features      = "2 pg_init_retries 50",
454                 .hwhandler     = "1 rdac",
455                 .prio_name     = PRIO_RDAC,
456                 .pgfailback    = -FAILBACK_IMMEDIATE,
457                 .no_path_retry = 30,
458         },
459         {
460                 /* DS4100 / FAStT100 */
461                 .vendor        = "IBM",
462                 .product       = "^1724",
463                 .bl_product    = "Universal Xport",
464                 .pgpolicy      = GROUP_BY_PRIO,
465                 .checker_name  = RDAC,
466                 .features      = "2 pg_init_retries 50",
467                 .hwhandler     = "1 rdac",
468                 .prio_name     = PRIO_RDAC,
469                 .pgfailback    = -FAILBACK_IMMEDIATE,
470                 .no_path_retry = 30,
471         },
472         {
473                 /* DS3000 / DS3200 / DS3300 / DS3400 / Boot DS */
474                 .vendor        = "IBM",
475                 .product       = "^1726",
476                 .bl_product    = "Universal Xport",
477                 .pgpolicy      = GROUP_BY_PRIO,
478                 .checker_name  = RDAC,
479                 .features      = "2 pg_init_retries 50",
480                 .hwhandler     = "1 rdac",
481                 .prio_name     = PRIO_RDAC,
482                 .pgfailback    = -FAILBACK_IMMEDIATE,
483                 .no_path_retry = 30,
484         },
485         {
486                 /* DS4400 / DS4500 / FAStT700 / FAStT900 */
487                 .vendor        = "IBM",
488                 .product       = "^1742",
489                 .bl_product    = "Universal Xport",
490                 .pgpolicy      = GROUP_BY_PRIO,
491                 .checker_name  = RDAC,
492                 .features      = "2 pg_init_retries 50",
493                 .hwhandler     = "1 rdac",
494                 .prio_name     = PRIO_RDAC,
495                 .pgfailback    = -FAILBACK_IMMEDIATE,
496                 .no_path_retry = 30,
497         },
498         {
499                 /* DS3500 / DS3512 / DS3524 */
500                 .vendor        = "IBM",
501                 .product       = "^1746",
502                 .bl_product    = "Universal Xport",
503                 .pgpolicy      = GROUP_BY_PRIO,
504                 .checker_name  = RDAC,
505                 .features      = "2 pg_init_retries 50",
506                 .hwhandler     = "1 rdac",
507                 .prio_name     = PRIO_RDAC,
508                 .pgfailback    = -FAILBACK_IMMEDIATE,
509                 .no_path_retry = 30,
510         },
511         {
512                 /* DCS3860 */
513                 .vendor        = "IBM",
514                 .product       = "^1813",
515                 .bl_product    = "Universal Xport",
516                 .pgpolicy      = GROUP_BY_PRIO,
517                 .checker_name  = RDAC,
518                 .features      = "2 pg_init_retries 50",
519                 .hwhandler     = "1 rdac",
520                 .prio_name     = PRIO_RDAC,
521                 .pgfailback    = -FAILBACK_IMMEDIATE,
522                 .no_path_retry = 30,
523         },
524         {
525                 /* DS3950 / DS4200 / DS4700 / DS5020 */
526                 .vendor        = "IBM",
527                 .product       = "^1814",
528                 .bl_product    = "Universal Xport",
529                 .pgpolicy      = GROUP_BY_PRIO,
530                 .checker_name  = RDAC,
531                 .features      = "2 pg_init_retries 50",
532                 .hwhandler     = "1 rdac",
533                 .prio_name     = PRIO_RDAC,
534                 .pgfailback    = -FAILBACK_IMMEDIATE,
535                 .no_path_retry = 30,
536         },
537         {
538                 /* DS4800 */
539                 .vendor        = "IBM",
540                 .product       = "^1815",
541                 .bl_product    = "Universal Xport",
542                 .pgpolicy      = GROUP_BY_PRIO,
543                 .checker_name  = RDAC,
544                 .features      = "2 pg_init_retries 50",
545                 .hwhandler     = "1 rdac",
546                 .prio_name     = PRIO_RDAC,
547                 .pgfailback    = -FAILBACK_IMMEDIATE,
548                 .no_path_retry = 30,
549         },
550         {
551                 /* DS5000 / DS5100 / DS5300 / DCS3700 */
552                 .vendor        = "IBM",
553                 .product       = "^1818",
554                 .bl_product    = "Universal Xport",
555                 .pgpolicy      = GROUP_BY_PRIO,
556                 .checker_name  = RDAC,
557                 .features      = "2 pg_init_retries 50",
558                 .hwhandler     = "1 rdac",
559                 .prio_name     = PRIO_RDAC,
560                 .pgfailback    = -FAILBACK_IMMEDIATE,
561                 .no_path_retry = 30,
562         },
563         {
564                 /* Netfinity Fibre Channel RAID Controller Unit */
565                 .vendor        = "IBM",
566                 .product       = "^3526",
567                 .bl_product    = "Universal Xport",
568                 .pgpolicy      = GROUP_BY_PRIO,
569                 .checker_name  = RDAC,
570                 .features      = "2 pg_init_retries 50",
571                 .hwhandler     = "1 rdac",
572                 .prio_name     = PRIO_RDAC,
573                 .pgfailback    = -FAILBACK_IMMEDIATE,
574                 .no_path_retry = 30,
575         },
576         {
577                 /* FAStT200 and FAStT500 */
578                 .vendor        = "IBM",
579                 .product       = "^(3542|3552)",
580                 .bl_product    = "Universal Xport",
581                 .pgpolicy      = GROUP_BY_PRIO,
582                 .checker_name  = RDAC,
583                 .features      = "2 pg_init_retries 50",
584                 .hwhandler     = "1 rdac",
585                 .prio_name     = PRIO_RDAC,
586                 .pgfailback    = -FAILBACK_IMMEDIATE,
587                 .no_path_retry = 30,
588         },
589         {
590                 /* Enterprise Storage Server(ESS) / Shark family */
591                 .vendor        = "IBM",
592                 .product       = "^2105",
593                 .no_path_retry = NO_PATH_RETRY_QUEUE,
594                 .pgpolicy      = MULTIBUS,
595         },
596         {
597                 /* DS6000 / DS6800 */
598                 .vendor        = "IBM",
599                 .product       = "^1750500",
600                 .no_path_retry = NO_PATH_RETRY_QUEUE,
601                 .pgpolicy      = GROUP_BY_PRIO,
602                 .pgfailback    = -FAILBACK_IMMEDIATE,
603                 .prio_name     = PRIO_ALUA,
604         },
605         {
606                 /* DS8000 family */
607                 .vendor        = "IBM",
608                 .product       = "^2107900",
609                 .no_path_retry = NO_PATH_RETRY_QUEUE,
610                 .pgpolicy      = MULTIBUS,
611         },
612         {
613                 /* Storwize family / SAN Volume Controller / Flex System V7000 / FlashSystem V840/V9000/9100 */
614                 .vendor        = "IBM",
615                 .product       = "^2145",
616                 .no_path_retry = NO_PATH_RETRY_QUEUE,
617                 .pgpolicy      = GROUP_BY_PRIO,
618                 .pgfailback    = -FAILBACK_IMMEDIATE,
619                 .prio_name     = PRIO_ALUA,
620         },
621         {
622                 /* PAV DASD ECKD */
623                 .vendor        = "IBM",
624                 .product       = "S/390 DASD ECKD",
625                 .bl_product    = "S/390",
626                 .uid_attribute = "ID_UID",
627                 .no_path_retry = NO_PATH_RETRY_QUEUE,
628                 .pgpolicy      = MULTIBUS,
629                 .checker_name  = DIRECTIO,
630         },
631         {
632                 /* PAV DASD FBA */
633                 .vendor        = "IBM",
634                 .product       = "S/390 DASD FBA",
635                 .bl_product    = "S/390",
636                 .uid_attribute = "ID_UID",
637                 .no_path_retry = NO_PATH_RETRY_QUEUE,
638                 .pgpolicy      = MULTIBUS,
639                 .checker_name  = DIRECTIO,
640         },
641         {
642                 /* Power RAID */
643                 .vendor        = "IBM",
644                 .product       = "^IPR",
645                 .no_path_retry = NO_PATH_RETRY_QUEUE,
646                 .hwhandler     = "1 alua",
647                 .pgpolicy      = GROUP_BY_PRIO,
648                 .pgfailback    = -FAILBACK_IMMEDIATE,
649                 .prio_name     = PRIO_ALUA,
650         },
651         {
652                 /* SAS RAID Controller Module (RSSM) */
653                 .vendor        = "IBM",
654                 .product       = "1820N00",
655                 .pgpolicy      = GROUP_BY_PRIO,
656                 .pgfailback    = -FAILBACK_IMMEDIATE,
657                 .no_path_retry = NO_PATH_RETRY_QUEUE,
658                 .prio_name     = PRIO_ALUA,
659         },
660         {
661                 /* XIV Storage System / FlashSystem A9000/A9000R */
662                 .vendor        = "(XIV|IBM)",
663                 .product       = "(NEXTRA|2810XIV)",
664                 .no_path_retry = NO_PATH_RETRY_QUEUE,
665                 .pgpolicy      = MULTIBUS,
666         },
667         {
668                 /* TMS RamSan / FlashSystem 710/720/810/820/840/900 */
669                 .vendor        = "(TMS|IBM)",
670                 .product       = "(RamSan|FlashSystem)",
671                 .pgpolicy      = MULTIBUS,
672         },
673         {
674                 /* (DDN) DCS9900, SONAS 2851-DR1 */
675                 .vendor        = "IBM",
676                 .product       = "^(DCS9900|2851)",
677                 .pgpolicy      = GROUP_BY_PRIO,
678                 .pgfailback    = -FAILBACK_IMMEDIATE,
679                 .prio_name     = PRIO_ALUA,
680                 .no_path_retry = 30,
681         },
682                 /*
683                  * IBM Power Virtual SCSI Devices
684                  *
685                  * Maintainer: Brian King <brking@linux.vnet.ibm.com>
686                  */
687         {
688                 /* AIX VDASD */
689                 .vendor        = "AIX",
690                 .product       = "VDASD",
691                 .pgpolicy      = MULTIBUS,
692                 .no_path_retry = (300 / DEFAULT_CHECKINT),
693         },
694         {
695                 /* 3303 NVDISK */
696                 .vendor        = "IBM",
697                 .product       = "3303[ ]+NVDISK",
698                 .no_path_retry = (300 / DEFAULT_CHECKINT),
699         },
700         {
701                 /* AIX NVDISK */
702                 .vendor        = "AIX",
703                 .product       = "NVDISK",
704                 .hwhandler     = "1 alua",
705                 .pgpolicy      = GROUP_BY_PRIO,
706                 .pgfailback    = -FAILBACK_IMMEDIATE,
707                 .no_path_retry = (300 / DEFAULT_CHECKINT),
708                 .prio_name     = PRIO_ALUA,
709         },
710         /*
711          * Lenovo
712          */
713         {
714                 /*
715                  * DE Series
716                  *
717                  * Maintainer: NetApp RDAC team <ng-eseries-upstream-maintainers@netapp.com>
718                  */
719                 .vendor        = "LENOVO",
720                 .product       = "DE_Series",
721                 .bl_product    = "Universal Xport",
722                 .pgpolicy      = GROUP_BY_PRIO,
723                 .checker_name  = RDAC,
724                 .features      = "2 pg_init_retries 50",
725                 .hwhandler     = "1 rdac",
726                 .prio_name     = PRIO_RDAC,
727                 .pgfailback    = -FAILBACK_IMMEDIATE,
728                 .no_path_retry = 30,
729         },
730         /*
731          * NetApp
732          */
733         {
734                 /*
735                  * ONTAP family
736                  *
737                  * Maintainer: Martin George <marting@netapp.com>
738                  */
739                 .vendor        = "NETAPP",
740                 .product       = "LUN",
741                 .features      = "2 pg_init_retries 50",
742                 .no_path_retry = NO_PATH_RETRY_QUEUE,
743                 .pgpolicy      = GROUP_BY_PRIO,
744                 .pgfailback    = -FAILBACK_IMMEDIATE,
745                 .flush_on_last_del = FLUSH_ENABLED,
746                 .dev_loss      = MAX_DEV_LOSS_TMO,
747                 .prio_name     = PRIO_ONTAP,
748                 .user_friendly_names = USER_FRIENDLY_NAMES_OFF,
749         },
750         {
751                 /*
752                  * SANtricity(RDAC) family
753                  *
754                  * Maintainer: NetApp RDAC team <ng-eseries-upstream-maintainers@netapp.com>
755                  */
756                 .vendor        = "(NETAPP|LSI|ENGENIO)",
757                 .product       = "INF-01-00",
758                 .bl_product    = "Universal Xport",
759                 .pgpolicy      = GROUP_BY_PRIO,
760                 .checker_name  = RDAC,
761                 .features      = "2 pg_init_retries 50",
762                 .hwhandler     = "1 rdac",
763                 .prio_name     = PRIO_RDAC,
764                 .pgfailback    = -FAILBACK_IMMEDIATE,
765                 .no_path_retry = 30,
766         },
767         {
768                 /*
769                  * SolidFir family
770                  *
771                  * Maintainer: PJ Waskiewicz <pj.waskiewicz@netapp.com>
772                  */
773                 .vendor        = "SolidFir",
774                 .product       = "SSD SAN",
775                 .pgpolicy      = MULTIBUS,
776                 .no_path_retry = 24,
777         },
778         {
779                 /*
780                  * NVMe-FC namespace devices: MULTIBUS, queueing preferred
781                  *
782                  * The hwtable is searched backwards, so place this after "Generic NVMe"
783                  */
784                 .vendor        = "NVME",
785                 .product       = "^NetApp ONTAP Controller",
786                 .pgpolicy      = MULTIBUS,
787                 .no_path_retry = NO_PATH_RETRY_QUEUE,
788         },
789         /*
790          * Nexenta
791          *
792          * Maintainer: Yacine Kheddache <yacine@alyseo.com>
793          */
794         {
795                 /* COMSTAR */
796                 .vendor        = "NEXENTA",
797                 .product       = "COMSTAR",
798                 .pgpolicy      = GROUP_BY_SERIAL,
799                 .no_path_retry = 30,
800         },
801         /*
802          * NEC
803          */
804         {
805                 /* M-Series */
806                 .vendor        = "NEC",
807                 .product       = "DISK ARRAY",
808                 .hwhandler     = "1 alua",
809                 .pgpolicy      = GROUP_BY_PRIO,
810                 .pgfailback    = -FAILBACK_IMMEDIATE,
811                 .prio_name     = PRIO_ALUA,
812         },
813         /*
814          * Oracle
815          */
816                 /*
817                  * Pillar Data / Oracle FS
818                  *
819                  * Maintainer: Srinivasan Ramani <srinivas.ramani@oracle.com>
820                  */
821         {
822                 /* Axiom */
823                 .vendor        = "^Pillar",
824                 .product       = "^Axiom",
825                 .pgpolicy      = GROUP_BY_PRIO,
826                 .pgfailback    = -FAILBACK_IMMEDIATE,
827                 .prio_name     = PRIO_ALUA,
828         },
829         {
830                 /* FS */
831                 .vendor        = "^Oracle",
832                 .product       = "^Oracle FS",
833                 .pgpolicy      = GROUP_BY_PRIO,
834                 .pgfailback    = -FAILBACK_IMMEDIATE,
835                 .prio_name     = PRIO_ALUA,
836         },
837                 /* Sun - StorageTek */
838         {
839                 /* B210, B220, B240 and B280 */
840                 .vendor        = "STK",
841                 .product       = "BladeCtlr",
842                 .bl_product    = "Universal Xport",
843                 .pgpolicy      = GROUP_BY_PRIO,
844                 .checker_name  = RDAC,
845                 .features      = "2 pg_init_retries 50",
846                 .hwhandler     = "1 rdac",
847                 .prio_name     = PRIO_RDAC,
848                 .pgfailback    = -FAILBACK_IMMEDIATE,
849                 .no_path_retry = 30,
850         },
851         {
852                 /* 9176, D173, D178, D210, D220, D240 and D280 */
853                 .vendor        = "STK",
854                 .product       = "OPENstorage",
855                 .bl_product    = "Universal Xport",
856                 .pgpolicy      = GROUP_BY_PRIO,
857                 .checker_name  = RDAC,
858                 .features      = "2 pg_init_retries 50",
859                 .hwhandler     = "1 rdac",
860                 .prio_name     = PRIO_RDAC,
861                 .pgfailback    = -FAILBACK_IMMEDIATE,
862                 .no_path_retry = 30,
863         },
864         {
865                 /* 6540 */
866                 .vendor        = "STK",
867                 .product       = "FLEXLINE 380",
868                 .bl_product    = "Universal Xport",
869                 .pgpolicy      = GROUP_BY_PRIO,
870                 .checker_name  = RDAC,
871                 .features      = "2 pg_init_retries 50",
872                 .hwhandler     = "1 rdac",
873                 .prio_name     = PRIO_RDAC,
874                 .pgfailback    = -FAILBACK_IMMEDIATE,
875                 .no_path_retry = 30,
876         },
877         {
878                 /* (Dot Hill) 3120, 3310, 3320, 3510 and 3511 */
879                 .vendor        = "SUN",
880                 .product       = "StorEdge 3",
881                 .pgpolicy      = MULTIBUS,
882         },
883         {
884                 /* 6580 and 6780 */
885                 .vendor        = "SUN",
886                 .product       = "STK6580_6780",
887                 .bl_product    = "Universal Xport",
888                 .pgpolicy      = GROUP_BY_PRIO,
889                 .checker_name  = RDAC,
890                 .features      = "2 pg_init_retries 50",
891                 .hwhandler     = "1 rdac",
892                 .prio_name     = PRIO_RDAC,
893                 .pgfailback    = -FAILBACK_IMMEDIATE,
894                 .no_path_retry = 30,
895         },
896         {
897                 /* 6130 / 6140 */
898                 .vendor        = "SUN",
899                 .product       = "CSM[12]00_R",
900                 .bl_product    = "Universal Xport",
901                 .pgpolicy      = GROUP_BY_PRIO,
902                 .checker_name  = RDAC,
903                 .features      = "2 pg_init_retries 50",
904                 .hwhandler     = "1 rdac",
905                 .prio_name     = PRIO_RDAC,
906                 .pgfailback    = -FAILBACK_IMMEDIATE,
907                 .no_path_retry = 30,
908         },
909         {
910                 /* 2500 / 2510 / 2530 / 2540 */
911                 .vendor        = "SUN",
912                 .product       = "LCSM100_[IEFS]",
913                 .bl_product    = "Universal Xport",
914                 .pgpolicy      = GROUP_BY_PRIO,
915                 .checker_name  = RDAC,
916                 .features      = "2 pg_init_retries 50",
917                 .hwhandler     = "1 rdac",
918                 .prio_name     = PRIO_RDAC,
919                 .pgfailback    = -FAILBACK_IMMEDIATE,
920                 .no_path_retry = 30,
921         },
922         {
923                 /* 6180 */
924                 .vendor        = "SUN",
925                 .product       = "SUN_6180",
926                 .bl_product    = "Universal Xport",
927                 .pgpolicy      = GROUP_BY_PRIO,
928                 .checker_name  = RDAC,
929                 .features      = "2 pg_init_retries 50",
930                 .hwhandler     = "1 rdac",
931                 .prio_name     = PRIO_RDAC,
932                 .pgfailback    = -FAILBACK_IMMEDIATE,
933                 .no_path_retry = 30,
934         },
935         {
936                 /* ArrayStorage */
937                 .vendor        = "SUN",
938                 .product       = "ArrayStorage",
939                 .bl_product    = "Universal Xport",
940                 .pgpolicy      = GROUP_BY_PRIO,
941                 .checker_name  = RDAC,
942                 .features      = "2 pg_init_retries 50",
943                 .hwhandler     = "1 rdac",
944                 .prio_name     = PRIO_RDAC,
945                 .pgfailback    = -FAILBACK_IMMEDIATE,
946                 .no_path_retry = 30,
947         },
948         {
949                 /* ZFS Storage Appliances */
950                 .vendor        = "SUN",
951                 .product       = "(Sun Storage|ZFS Storage|COMSTAR)",
952                 .pgpolicy      = GROUP_BY_PRIO,
953                 .pgfailback    = -FAILBACK_IMMEDIATE,
954                 .prio_name     = PRIO_ALUA,
955                 .no_path_retry = 30,
956         },
957         /*
958          * Pivot3
959          *
960          * Maintainer: Bart Brooks <bartb@pivot3.com>
961          */
962         {
963                 /* Raige */
964                 .vendor        = "PIVOT3",
965                 .product       = "RAIGE VOLUME",
966                 .no_path_retry = NO_PATH_RETRY_QUEUE,
967                 .pgpolicy      = MULTIBUS,
968         },
969         {
970                 /* NexGen / vSTAC */
971                 .vendor        = "(NexGen|Pivot3)",
972                 .product       = "(TierStore|vSTAC)",
973                 .pgpolicy      = GROUP_BY_PRIO,
974                 .pgfailback    = -FAILBACK_IMMEDIATE,
975                 .prio_name     = PRIO_ALUA,
976                 .no_path_retry = NO_PATH_RETRY_QUEUE,
977         },
978         /*
979          * Intel
980          */
981         {
982                 /* Multi-Flex */
983                 .vendor        = "(Intel|INTEL)",
984                 .product       = "Multi-Flex",
985                 .bl_product    = "VTrak V-LUN",
986                 .hwhandler     = "1 alua",
987                 .pgpolicy      = GROUP_BY_PRIO,
988                 .pgfailback    = -FAILBACK_IMMEDIATE,
989                 .no_path_retry = NO_PATH_RETRY_QUEUE,
990                 .prio_name     = PRIO_ALUA,
991         },
992         /*
993          * Linux-IO Target
994          */
995         {
996                 /* Linux-IO Target */
997                 .vendor        = "(LIO-ORG|SUSE)",
998                 .product       = "RBD",
999                 .hwhandler     = "1 alua",
1000                 .pgpolicy      = GROUP_BY_PRIO,
1001                 .pgfailback    = -FAILBACK_IMMEDIATE,
1002                 .no_path_retry = 12,
1003                 .prio_name     = PRIO_ALUA,
1004         },
1005         /*
1006          * DataCore
1007          */
1008         {
1009                 /* SANmelody */
1010                 .vendor        = "DataCore",
1011                 .product       = "SANmelody",
1012                 .pgpolicy      = GROUP_BY_PRIO,
1013                 .pgfailback    = -FAILBACK_IMMEDIATE,
1014                 .no_path_retry = NO_PATH_RETRY_QUEUE,
1015                 .prio_name     = PRIO_ALUA,
1016         },
1017         {
1018                 /* SANsymphony */
1019                 .vendor        = "DataCore",
1020                 .product       = "Virtual Disk",
1021                 .pgpolicy      = GROUP_BY_PRIO,
1022                 .pgfailback    = -FAILBACK_IMMEDIATE,
1023                 .no_path_retry = NO_PATH_RETRY_QUEUE,
1024                 .prio_name     = PRIO_ALUA,
1025         },
1026         /*
1027          * Pure Storage
1028          */
1029         {
1030                 /* FlashArray */
1031                 .vendor        = "PURE",
1032                 .product       = "FlashArray",
1033                 .pgpolicy      = MULTIBUS,
1034         },
1035         /*
1036          * Huawei
1037          */
1038         {
1039                 /* OceanStor V3 */
1040                 .vendor        = "HUAWEI",
1041                 .product       = "XSG1",
1042                 .pgpolicy      = GROUP_BY_PRIO,
1043                 .prio_name     = PRIO_ALUA,
1044         },
1045         /*
1046          * Kove
1047          */
1048         {
1049                 /* XPD */
1050                 .vendor        = "KOVE",
1051                 .product       = "XPD",
1052                 .pgpolicy      = MULTIBUS,
1053         },
1054         /*
1055          * Infinidat
1056          *
1057          * Maintainer: Arnon Yaari <arnony@infinidat.com>
1058          */
1059         {
1060                 /* InfiniBox */
1061                 .vendor        = "NFINIDAT",
1062                 .product       = "InfiniBox",
1063                 .pgpolicy      = GROUP_BY_PRIO,
1064                 .pgfailback    = 30,
1065                 .prio_name     = PRIO_ALUA,
1066                 .selector      = "round-robin 0",
1067                 .rr_weight     = RR_WEIGHT_PRIO,
1068                 .no_path_retry = NO_PATH_RETRY_FAIL,
1069                 .minio         = 1,
1070                 .minio_rq      = 1,
1071                 .flush_on_last_del = FLUSH_ENABLED,
1072                 .fast_io_fail  = 15,
1073                 .dev_loss      = 15,
1074         },
1075         /*
1076          * Kaminario
1077          */
1078         {
1079                 /* K2 */
1080                 .vendor        = "KMNRIO",
1081                 .product       = "K2",
1082                 .pgpolicy      = MULTIBUS,
1083         },
1084         /*
1085          * Western Digital (Tegile Systems)
1086          */
1087         {
1088                 /* IntelliFlash */
1089                 .vendor        = "TEGILE",
1090                 .product       = "(ZEBI-(FC|ISCSI)|INTELLIFLASH)",
1091                 .hwhandler     = "1 alua",
1092                 .pgpolicy      = GROUP_BY_PRIO,
1093                 .pgfailback    = -FAILBACK_IMMEDIATE,
1094                 .prio_name     = PRIO_ALUA,
1095                 .no_path_retry = 10,
1096         },
1097         /*
1098          * Imation/Nexsan
1099          */
1100         {
1101                 /* E-Series */
1102                 .vendor        = "NEXSAN",
1103                 .product       = "NXS-B0",
1104                 .pgpolicy      = GROUP_BY_PRIO,
1105                 .pgfailback    = -FAILBACK_IMMEDIATE,
1106                 .prio_name     = PRIO_ALUA,
1107                 .no_path_retry = 15,
1108         },
1109         {
1110                 /* SATABeast / SATABoy */
1111                 .vendor        = "NEXSAN",
1112                 .product       = "SATAB",
1113                 .pgpolicy      = GROUP_BY_PRIO,
1114                 .pgfailback    = -FAILBACK_IMMEDIATE,
1115                 .prio_name     = PRIO_ALUA,
1116                 .no_path_retry = 15,
1117         },
1118         {
1119                 /* NST / UNITY */
1120                 .vendor        = "Nexsan",
1121                 .product       = "(NestOS|NST5000)",
1122                 .hwhandler     = "1 alua",
1123                 .pgpolicy      = GROUP_BY_PRIO,
1124                 .pgfailback    = -FAILBACK_IMMEDIATE,
1125                 .prio_name     = PRIO_ALUA,
1126                 .no_path_retry = 30,
1127         },
1128         /*
1129          * Violin Systems
1130          */
1131         {
1132                 /* 3000 / 6000 Series */
1133                 .vendor        = "VIOLIN",
1134                 .product       = "SAN ARRAY$",
1135                 .pgpolicy      = GROUP_BY_SERIAL,
1136                 .no_path_retry = 30,
1137         },
1138         {
1139                 /* 3000 / 6000 Series - ALUA mode */
1140                 .vendor        = "VIOLIN",
1141                 .product       = "SAN ARRAY ALUA",
1142                 .hwhandler     = "1 alua",
1143                 .pgpolicy      = GROUP_BY_PRIO,
1144                 .pgfailback    = -FAILBACK_IMMEDIATE,
1145                 .prio_name     = PRIO_ALUA,
1146                 .no_path_retry = 30,
1147         },
1148         {
1149                 /* FSP 7000 family */
1150                 .vendor        = "VIOLIN",
1151                 .product       = "CONCERTO ARRAY",
1152                 .pgpolicy      = MULTIBUS,
1153                 .no_path_retry = 30,
1154         },
1155                 /* Xiotech */
1156         {
1157                 /* Intelligent Storage Elements family */
1158                 .vendor        = "(XIOTECH|XIOtech)",
1159                 .product       = "ISE",
1160                 .pgpolicy      = MULTIBUS,
1161                 .no_path_retry = 12,
1162         },
1163         {
1164                 /* iglu blaze family */
1165                 .vendor        = "(XIOTECH|XIOtech)",
1166                 .product       = "IGLU DISK",
1167                 .pgpolicy      = MULTIBUS,
1168                 .no_path_retry = 30,
1169         },
1170         {
1171                 /* Magnitude family */
1172                 .vendor        = "(XIOTECH|XIOtech)",
1173                 .product       = "Magnitude",
1174                 .pgpolicy      = MULTIBUS,
1175                 .no_path_retry = 30,
1176         },
1177         /*
1178          * Promise Technology
1179          */
1180         {
1181                 /* VTrak family */
1182                 .vendor        = "Promise",
1183                 .product       = "VTrak",
1184                 .bl_product    = "VTrak V-LUN",
1185                 .hwhandler     = "1 alua",
1186                 .pgpolicy      = GROUP_BY_PRIO,
1187                 .pgfailback    = -FAILBACK_IMMEDIATE,
1188                 .prio_name     = PRIO_ALUA,
1189                 .no_path_retry = 30,
1190         },
1191         {
1192                 /* Vess family */
1193                 .vendor        = "Promise",
1194                 .product       = "Vess",
1195                 .bl_product    = "Vess V-LUN",
1196                 .hwhandler     = "1 alua",
1197                 .pgpolicy      = GROUP_BY_PRIO,
1198                 .pgfailback    = -FAILBACK_IMMEDIATE,
1199                 .prio_name     = PRIO_ALUA,
1200                 .no_path_retry = 30,
1201         },
1202         /*
1203          * Infortrend Technology
1204          */
1205         {
1206                 /* EonStor / ESVA */
1207                 .vendor        = "^IFT",
1208                 .product       = ".*",
1209                 .pgpolicy      = GROUP_BY_PRIO,
1210                 .pgfailback    = -FAILBACK_IMMEDIATE,
1211                 .prio_name     = PRIO_ALUA,
1212                 .no_path_retry = 30,
1213         },
1214         /*
1215          * Seagate Technology (Dot Hill Systems)
1216          */
1217         {
1218                 /* SANnet family */
1219                 .vendor        = "DotHill",
1220                 .product       = "SANnet",
1221                 .pgpolicy      = MULTIBUS,
1222                 .no_path_retry = 30,
1223         },
1224         {
1225                 /* R/Evolution family */
1226                 .vendor        = "DotHill",
1227                 .product       = "R/Evo",
1228                 .pgpolicy      = GROUP_BY_PRIO,
1229                 .pgfailback    = -FAILBACK_IMMEDIATE,
1230                 .prio_name     = PRIO_ALUA,
1231                 .no_path_retry = 30,
1232         },
1233         {
1234                 /* AssuredSAN family */
1235                 .vendor        = "DotHill",
1236                 .product       = "^DH",
1237                 .pgpolicy      = GROUP_BY_PRIO,
1238                 .pgfailback    = -FAILBACK_IMMEDIATE,
1239                 .prio_name     = PRIO_ALUA,
1240                 .no_path_retry = 30,
1241         },
1242         /*
1243          * AccelStor
1244          */
1245         {
1246                 /* NeoSapphire */
1247                 .vendor        = "AStor",
1248                 .product       = "NeoSapphire",
1249                 .pgpolicy      = MULTIBUS,
1250                 .no_path_retry = 30,
1251         },
1252         /*
1253          * INSPUR
1254          */
1255         {
1256                 /* AS5300/AS5500 G2 */
1257                 .vendor        = "INSPUR",
1258                 .product       = "MCS",
1259                 .pgpolicy      = GROUP_BY_PRIO,
1260                 .pgfailback    = -FAILBACK_IMMEDIATE,
1261                 .prio_name     = PRIO_ALUA,
1262         },
1263         /*
1264          * EOL
1265          */
1266         {
1267                 /* NULL */
1268                 .vendor        = NULL,
1269                 .product       = NULL,
1270         },
1271 };
1272
1273 int setup_default_hwtable(vector hw)
1274 {
1275         int r = 0;
1276         struct hwentry * hwe = default_hw;
1277
1278         while (hwe->vendor) {
1279                 r += store_hwe(hw, hwe);
1280                 hwe++;
1281         }
1282         return r;
1283 }