xref: /dpdk/drivers/net/axgbe/axgbe_ethdev.h (revision 200bc52e5aa0d72e70464c9cd22b55cf536ed13c)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
3  *   Copyright(c) 2018 Synopsys, Inc. All rights reserved.
4  */
5 
6 #ifndef RTE_ETH_AXGBE_H_
7 #define RTE_ETH_AXGBE_H_
8 
9 #include <rte_mempool.h>
10 #include <rte_lcore.h>
11 #include "axgbe_common.h"
12 
13 #define IRQ				0xff
14 #define VLAN_HLEN			4
15 
16 #define AXGBE_TX_MAX_BUF_SIZE		(0x3fff & ~(64 - 1))
17 #define AXGBE_RX_MAX_BUF_SIZE		(0x3fff & ~(64 - 1))
18 #define AXGBE_RX_MIN_BUF_SIZE		(RTE_ETHER_MAX_LEN + VLAN_HLEN)
19 #define AXGBE_MAX_MAC_ADDRS		1
20 
21 #define AXGBE_RX_BUF_ALIGN		64
22 
23 #define AXGBE_MAX_DMA_CHANNELS		16
24 #define AXGBE_MAX_QUEUES		16
25 #define AXGBE_PRIORITY_QUEUES		8
26 #define AXGBE_DMA_STOP_TIMEOUT		1
27 
28 /* DMA cache settings - Outer sharable, write-back, write-allocate */
29 #define AXGBE_DMA_OS_AXDOMAIN		0x2
30 #define AXGBE_DMA_OS_ARCACHE		0xb
31 #define AXGBE_DMA_OS_AWCACHE		0xf
32 
33 /* DMA cache settings - System, no caches used */
34 #define AXGBE_DMA_SYS_AXDOMAIN		0x3
35 #define AXGBE_DMA_SYS_ARCACHE		0x0
36 #define AXGBE_DMA_SYS_AWCACHE		0x0
37 
38 /* DMA channel interrupt modes */
39 #define AXGBE_IRQ_MODE_EDGE		0
40 #define AXGBE_IRQ_MODE_LEVEL		1
41 
42 #define AXGBE_DMA_INTERRUPT_MASK	0x31c7
43 
44 #define AXGMAC_MIN_PACKET		60
45 #define AXGMAC_STD_PACKET_MTU		1500
46 #define AXGMAC_MAX_STD_PACKET		1518
47 #define AXGMAC_JUMBO_PACKET_MTU		9000
48 #define AXGMAC_MAX_JUMBO_PACKET		9018
49 /* Inter-frame gap + preamble */
50 #define AXGMAC_ETH_PREAMBLE		(12 + 8)
51 
52 #define AXGMAC_PFC_DATA_LEN		46
53 #define AXGMAC_PFC_DELAYS		14000
54 
55 /* PCI BAR mapping */
56 #define AXGBE_AXGMAC_BAR		0
57 #define AXGBE_XPCS_BAR			1
58 #define AXGBE_MAC_PROP_OFFSET		0x1d000
59 #define AXGBE_I2C_CTRL_OFFSET		0x1e000
60 
61 /* PCI clock frequencies */
62 #define AXGBE_V2_DMA_CLOCK_FREQ		500000000
63 #define AXGBE_V2_PTP_CLOCK_FREQ		125000000
64 
65 #define AXGMAC_FIFO_MIN_ALLOC		2048
66 #define AXGMAC_FIFO_UNIT		256
67 #define AXGMAC_FIFO_ALIGN(_x)                            \
68 	(((_x) + AXGMAC_FIFO_UNIT - 1) & ~(XGMAC_FIFO_UNIT - 1))
69 #define AXGMAC_FIFO_FC_OFF		2048
70 #define AXGMAC_FIFO_FC_MIN		4096
71 
72 #define AXGBE_TC_MIN_QUANTUM		10
73 
74 /* Flow control queue count */
75 #define AXGMAC_MAX_FLOW_CONTROL_QUEUES	8
76 
77 /* Flow control threshold units */
78 #define AXGMAC_FLOW_CONTROL_UNIT	512
79 #define AXGMAC_FLOW_CONTROL_ALIGN(_x)				\
80 	(((_x) + AXGMAC_FLOW_CONTROL_UNIT - 1) &		\
81 	~(AXGMAC_FLOW_CONTROL_UNIT - 1))
82 #define AXGMAC_FLOW_CONTROL_VALUE(_x)				\
83 	(((_x) < 1024) ? 0 : ((_x) / AXGMAC_FLOW_CONTROL_UNIT) - 2)
84 #define AXGMAC_FLOW_CONTROL_MAX		33280
85 
86 /* Maximum MAC address hash table size (256 bits = 8 bytes) */
87 #define AXGBE_MAC_HASH_TABLE_SIZE	8
88 
89 /* Receive Side Scaling */
90 #define AXGBE_RSS_OFFLOAD  ( \
91 	ETH_RSS_IPV4 | \
92 	ETH_RSS_NONFRAG_IPV4_TCP | \
93 	ETH_RSS_NONFRAG_IPV4_UDP | \
94 	ETH_RSS_IPV6 | \
95 	ETH_RSS_NONFRAG_IPV6_TCP | \
96 	ETH_RSS_NONFRAG_IPV6_UDP)
97 
98 #define AXGBE_RSS_HASH_KEY_SIZE		40
99 #define AXGBE_RSS_MAX_TABLE_SIZE	256
100 #define AXGBE_RSS_LOOKUP_TABLE_TYPE	0
101 #define AXGBE_RSS_HASH_KEY_TYPE		1
102 
103 /* Auto-negotiation */
104 #define AXGBE_AN_MS_TIMEOUT		500
105 #define AXGBE_LINK_TIMEOUT		5
106 
107 #define AXGBE_SGMII_AN_LINK_STATUS	BIT(1)
108 #define AXGBE_SGMII_AN_LINK_SPEED	(BIT(2) | BIT(3))
109 #define AXGBE_SGMII_AN_LINK_SPEED_100	0x04
110 #define AXGBE_SGMII_AN_LINK_SPEED_1000	0x08
111 #define AXGBE_SGMII_AN_LINK_DUPLEX	BIT(4)
112 
113 /* ECC correctable error notification window (seconds) */
114 #define AXGBE_ECC_LIMIT			60
115 
116 /* MDIO port types */
117 #define AXGMAC_MAX_C22_PORT		3
118 
119 /* Helper macro for descriptor handling
120  *  Always use AXGBE_GET_DESC_DATA to access the descriptor data
121  *  since the index is free-running and needs to be and-ed
122  *  with the descriptor count value of the ring to index to
123  *  the proper descriptor data.
124  */
125 #define AXGBE_GET_DESC_DATA(_ring, _idx)			\
126 	((_ring)->rdata +					\
127 	 ((_idx) & ((_ring)->rdesc_count - 1)))
128 
129 struct axgbe_port;
130 
131 enum axgbe_state {
132 	AXGBE_DOWN,
133 	AXGBE_LINK_INIT,
134 	AXGBE_LINK_ERR,
135 	AXGBE_STOPPED,
136 };
137 
138 enum axgbe_int {
139 	AXGMAC_INT_DMA_CH_SR_TI,
140 	AXGMAC_INT_DMA_CH_SR_TPS,
141 	AXGMAC_INT_DMA_CH_SR_TBU,
142 	AXGMAC_INT_DMA_CH_SR_RI,
143 	AXGMAC_INT_DMA_CH_SR_RBU,
144 	AXGMAC_INT_DMA_CH_SR_RPS,
145 	AXGMAC_INT_DMA_CH_SR_TI_RI,
146 	AXGMAC_INT_DMA_CH_SR_FBE,
147 	AXGMAC_INT_DMA_ALL,
148 };
149 
150 enum axgbe_int_state {
151 	AXGMAC_INT_STATE_SAVE,
152 	AXGMAC_INT_STATE_RESTORE,
153 };
154 
155 enum axgbe_ecc_sec {
156 	AXGBE_ECC_SEC_TX,
157 	AXGBE_ECC_SEC_RX,
158 	AXGBE_ECC_SEC_DESC,
159 };
160 
161 enum axgbe_speed {
162 	AXGBE_SPEED_1000 = 0,
163 	AXGBE_SPEED_2500,
164 	AXGBE_SPEED_10000,
165 	AXGBE_SPEEDS,
166 };
167 
168 enum axgbe_xpcs_access {
169 	AXGBE_XPCS_ACCESS_V1 = 0,
170 	AXGBE_XPCS_ACCESS_V2,
171 };
172 
173 enum axgbe_an_mode {
174 	AXGBE_AN_MODE_CL73 = 0,
175 	AXGBE_AN_MODE_CL73_REDRV,
176 	AXGBE_AN_MODE_CL37,
177 	AXGBE_AN_MODE_CL37_SGMII,
178 	AXGBE_AN_MODE_NONE,
179 };
180 
181 enum axgbe_an {
182 	AXGBE_AN_READY = 0,
183 	AXGBE_AN_PAGE_RECEIVED,
184 	AXGBE_AN_INCOMPAT_LINK,
185 	AXGBE_AN_COMPLETE,
186 	AXGBE_AN_NO_LINK,
187 	AXGBE_AN_ERROR,
188 };
189 
190 enum axgbe_rx {
191 	AXGBE_RX_BPA = 0,
192 	AXGBE_RX_XNP,
193 	AXGBE_RX_COMPLETE,
194 	AXGBE_RX_ERROR,
195 };
196 
197 enum axgbe_mode {
198 	AXGBE_MODE_KX_1000 = 0,
199 	AXGBE_MODE_KX_2500,
200 	AXGBE_MODE_KR,
201 	AXGBE_MODE_X,
202 	AXGBE_MODE_SGMII_100,
203 	AXGBE_MODE_SGMII_1000,
204 	AXGBE_MODE_SFI,
205 	AXGBE_MODE_UNKNOWN,
206 };
207 
208 enum axgbe_speedset {
209 	AXGBE_SPEEDSET_1000_10000 = 0,
210 	AXGBE_SPEEDSET_2500_10000,
211 };
212 
213 enum axgbe_mdio_mode {
214 	AXGBE_MDIO_MODE_NONE = 0,
215 	AXGBE_MDIO_MODE_CL22,
216 	AXGBE_MDIO_MODE_CL45,
217 };
218 
219 struct axgbe_phy {
220 	uint32_t supported;
221 	uint32_t advertising;
222 	uint32_t lp_advertising;
223 
224 	int address;
225 
226 	int autoneg;
227 	int speed;
228 	int duplex;
229 
230 	int link;
231 
232 	int pause_autoneg;
233 	int tx_pause;
234 	int rx_pause;
235 };
236 
237 enum axgbe_i2c_cmd {
238 	AXGBE_I2C_CMD_READ = 0,
239 	AXGBE_I2C_CMD_WRITE,
240 };
241 
242 struct axgbe_i2c_op {
243 	enum axgbe_i2c_cmd cmd;
244 
245 	unsigned int target;
246 
247 	uint8_t *buf;
248 	unsigned int len;
249 };
250 
251 struct axgbe_i2c_op_state {
252 	struct axgbe_i2c_op *op;
253 
254 	unsigned int tx_len;
255 	unsigned char *tx_buf;
256 
257 	unsigned int rx_len;
258 	unsigned char *rx_buf;
259 
260 	unsigned int tx_abort_source;
261 
262 	int ret;
263 };
264 
265 struct axgbe_i2c {
266 	unsigned int started;
267 	unsigned int max_speed_mode;
268 	unsigned int rx_fifo_size;
269 	unsigned int tx_fifo_size;
270 
271 	struct axgbe_i2c_op_state op_state;
272 };
273 
274 struct axgbe_hw_if {
275 	void (*config_flow_control)(struct axgbe_port *);
276 	int (*config_rx_mode)(struct axgbe_port *);
277 
278 	int (*init)(struct axgbe_port *);
279 
280 	int (*read_mmd_regs)(struct axgbe_port *, int, int);
281 	void (*write_mmd_regs)(struct axgbe_port *, int, int, int);
282 	int (*set_speed)(struct axgbe_port *, int);
283 
284 	int (*set_ext_mii_mode)(struct axgbe_port *, unsigned int,
285 				enum axgbe_mdio_mode);
286 	int (*read_ext_mii_regs)(struct axgbe_port *, int, int);
287 	int (*write_ext_mii_regs)(struct axgbe_port *, int, int, uint16_t);
288 
289 	/* For FLOW ctrl */
290 	int (*config_tx_flow_control)(struct axgbe_port *);
291 	int (*config_rx_flow_control)(struct axgbe_port *);
292 
293 	int (*exit)(struct axgbe_port *);
294 };
295 
296 /* This structure represents implementation specific routines for an
297  * implementation of a PHY. All routines are required unless noted below.
298  *   Optional routines:
299  *     kr_training_pre, kr_training_post
300  */
301 struct axgbe_phy_impl_if {
302 	/* Perform Setup/teardown actions */
303 	int (*init)(struct axgbe_port *);
304 	void (*exit)(struct axgbe_port *);
305 
306 	/* Perform start/stop specific actions */
307 	int (*reset)(struct axgbe_port *);
308 	int (*start)(struct axgbe_port *);
309 	void (*stop)(struct axgbe_port *);
310 
311 	/* Return the link status */
312 	int (*link_status)(struct axgbe_port *, int *);
313 
314 	/* Indicate if a particular speed is valid */
315 	int (*valid_speed)(struct axgbe_port *, int);
316 
317 	/* Check if the specified mode can/should be used */
318 	bool (*use_mode)(struct axgbe_port *, enum axgbe_mode);
319 	/* Switch the PHY into various modes */
320 	void (*set_mode)(struct axgbe_port *, enum axgbe_mode);
321 	/* Retrieve mode needed for a specific speed */
322 	enum axgbe_mode (*get_mode)(struct axgbe_port *, int);
323 	/* Retrieve new/next mode when trying to auto-negotiate */
324 	enum axgbe_mode (*switch_mode)(struct axgbe_port *);
325 	/* Retrieve current mode */
326 	enum axgbe_mode (*cur_mode)(struct axgbe_port *);
327 
328 	/* Retrieve current auto-negotiation mode */
329 	enum axgbe_an_mode (*an_mode)(struct axgbe_port *);
330 
331 	/* Configure auto-negotiation settings */
332 	int (*an_config)(struct axgbe_port *);
333 
334 	/* Set/override auto-negotiation advertisement settings */
335 	unsigned int (*an_advertising)(struct axgbe_port *port);
336 
337 	/* Process results of auto-negotiation */
338 	enum axgbe_mode (*an_outcome)(struct axgbe_port *);
339 
340 	/* Pre/Post auto-negotiation support */
341 	void (*an_pre)(struct axgbe_port *port);
342 	void (*an_post)(struct axgbe_port *port);
343 
344 	/* Pre/Post KR training enablement support */
345 	void (*kr_training_pre)(struct axgbe_port *);
346 	void (*kr_training_post)(struct axgbe_port *);
347 };
348 
349 struct axgbe_phy_if {
350 	/* For PHY setup/teardown */
351 	int (*phy_init)(struct axgbe_port *);
352 	void (*phy_exit)(struct axgbe_port *);
353 
354 	/* For PHY support when setting device up/down */
355 	int (*phy_reset)(struct axgbe_port *);
356 	int (*phy_start)(struct axgbe_port *);
357 	void (*phy_stop)(struct axgbe_port *);
358 
359 	/* For PHY support while device is up */
360 	void (*phy_status)(struct axgbe_port *);
361 	int (*phy_config_aneg)(struct axgbe_port *);
362 
363 	/* For PHY settings validation */
364 	int (*phy_valid_speed)(struct axgbe_port *, int);
365 	/* For single interrupt support */
366 	void (*an_isr)(struct axgbe_port *);
367 	/* PHY implementation specific services */
368 	struct axgbe_phy_impl_if phy_impl;
369 };
370 
371 struct axgbe_i2c_if {
372 	/* For initial I2C setup */
373 	int (*i2c_init)(struct axgbe_port *);
374 
375 	/* For I2C support when setting device up/down */
376 	int (*i2c_start)(struct axgbe_port *);
377 	void (*i2c_stop)(struct axgbe_port *);
378 
379 	/* For performing I2C operations */
380 	int (*i2c_xfer)(struct axgbe_port *, struct axgbe_i2c_op *);
381 };
382 
383 /* This structure contains flags that indicate what hardware features
384  * or configurations are present in the device.
385  */
386 struct axgbe_hw_features {
387 	/* HW Version */
388 	unsigned int version;
389 
390 	/* HW Feature Register0 */
391 	unsigned int gmii;		/* 1000 Mbps support */
392 	unsigned int vlhash;		/* VLAN Hash Filter */
393 	unsigned int sma;		/* SMA(MDIO) Interface */
394 	unsigned int rwk;		/* PMT remote wake-up packet */
395 	unsigned int mgk;		/* PMT magic packet */
396 	unsigned int mmc;		/* RMON module */
397 	unsigned int aoe;		/* ARP Offload */
398 	unsigned int ts;		/* IEEE 1588-2008 Advanced Timestamp */
399 	unsigned int eee;		/* Energy Efficient Ethernet */
400 	unsigned int tx_coe;		/* Tx Checksum Offload */
401 	unsigned int rx_coe;		/* Rx Checksum Offload */
402 	unsigned int addn_mac;		/* Additional MAC Addresses */
403 	unsigned int ts_src;		/* Timestamp Source */
404 	unsigned int sa_vlan_ins;	/* Source Address or VLAN Insertion */
405 
406 	/* HW Feature Register1 */
407 	unsigned int rx_fifo_size;	/* MTL Receive FIFO Size */
408 	unsigned int tx_fifo_size;	/* MTL Transmit FIFO Size */
409 	unsigned int adv_ts_hi;		/* Advance Timestamping High Word */
410 	unsigned int dma_width;		/* DMA width */
411 	unsigned int dcb;		/* DCB Feature */
412 	unsigned int sph;		/* Split Header Feature */
413 	unsigned int tso;		/* TCP Segmentation Offload */
414 	unsigned int dma_debug;		/* DMA Debug Registers */
415 	unsigned int rss;		/* Receive Side Scaling */
416 	unsigned int tc_cnt;		/* Number of Traffic Classes */
417 	unsigned int hash_table_size;	/* Hash Table Size */
418 	unsigned int l3l4_filter_num;	/* Number of L3-L4 Filters */
419 
420 	/* HW Feature Register2 */
421 	unsigned int rx_q_cnt;		/* Number of MTL Receive Queues */
422 	unsigned int tx_q_cnt;		/* Number of MTL Transmit Queues */
423 	unsigned int rx_ch_cnt;		/* Number of DMA Receive Channels */
424 	unsigned int tx_ch_cnt;		/* Number of DMA Transmit Channels */
425 	unsigned int pps_out_num;	/* Number of PPS outputs */
426 	unsigned int aux_snap_num;	/* Number of Aux snapshot inputs */
427 };
428 
429 struct axgbe_version_data {
430 	void (*init_function_ptrs_phy_impl)(struct axgbe_phy_if *);
431 	enum axgbe_xpcs_access xpcs_access;
432 	unsigned int mmc_64bit;
433 	unsigned int tx_max_fifo_size;
434 	unsigned int rx_max_fifo_size;
435 	unsigned int tx_tstamp_workaround;
436 	unsigned int ecc_support;
437 	unsigned int i2c_support;
438 	unsigned int an_cdr_workaround;
439 };
440 
441 /*
442  * Structure to store private data for each port.
443  */
444 struct axgbe_port {
445 	/*  Ethdev where port belongs*/
446 	struct rte_eth_dev *eth_dev;
447 	/* Pci dev info */
448 	const struct rte_pci_device *pci_dev;
449 	/* Version related data */
450 	struct axgbe_version_data *vdata;
451 
452 	/* AXGMAC/XPCS related mmio registers */
453 	void *xgmac_regs;	/* AXGMAC CSRs */
454 	void *xpcs_regs;	/* XPCS MMD registers */
455 	void *xprop_regs;	/* AXGBE property registers */
456 	void *xi2c_regs;	/* AXGBE I2C CSRs */
457 
458 	bool cdr_track_early;
459 	/* XPCS indirect addressing lock */
460 	unsigned int xpcs_window_def_reg;
461 	unsigned int xpcs_window_sel_reg;
462 	unsigned int xpcs_window;
463 	unsigned int xpcs_window_size;
464 	unsigned int xpcs_window_mask;
465 
466 	/* Flags representing axgbe_state */
467 	unsigned long dev_state;
468 
469 	struct axgbe_hw_if hw_if;
470 	struct axgbe_phy_if phy_if;
471 	struct axgbe_i2c_if i2c_if;
472 
473 	/* AXI DMA settings */
474 	unsigned int coherent;
475 	unsigned int axdomain;
476 	unsigned int arcache;
477 	unsigned int awcache;
478 
479 	unsigned int tx_max_channel_count;
480 	unsigned int rx_max_channel_count;
481 	unsigned int channel_count;
482 	unsigned int tx_ring_count;
483 	unsigned int tx_desc_count;
484 	unsigned int rx_ring_count;
485 	unsigned int rx_desc_count;
486 
487 	unsigned int tx_max_q_count;
488 	unsigned int rx_max_q_count;
489 	unsigned int tx_q_count;
490 	unsigned int rx_q_count;
491 
492 	/* Tx/Rx common settings */
493 	unsigned int pblx8;
494 
495 	/* Tx settings */
496 	unsigned int tx_sf_mode;
497 	unsigned int tx_threshold;
498 	unsigned int tx_pbl;
499 	unsigned int tx_osp_mode;
500 	unsigned int tx_max_fifo_size;
501 
502 	/* Rx settings */
503 	unsigned int rx_sf_mode;
504 	unsigned int rx_threshold;
505 	unsigned int rx_pbl;
506 	unsigned int rx_max_fifo_size;
507 	unsigned int rx_buf_size;
508 
509 	/* Device clocks */
510 	unsigned long sysclk_rate;
511 	unsigned long ptpclk_rate;
512 
513 	/* Keeps track of power mode */
514 	unsigned int power_down;
515 
516 	/* Current PHY settings */
517 	int phy_link;
518 	int phy_speed;
519 
520 	pthread_mutex_t xpcs_mutex;
521 	pthread_mutex_t i2c_mutex;
522 	pthread_mutex_t an_mutex;
523 	pthread_mutex_t phy_mutex;
524 
525 	/* Flow control settings */
526 	unsigned int pause_autoneg;
527 	unsigned int tx_pause;
528 	unsigned int rx_pause;
529 	unsigned int rx_rfa[AXGBE_MAX_QUEUES];
530 	unsigned int rx_rfd[AXGBE_MAX_QUEUES];
531 	unsigned int fifo;
532 
533 	/* Receive Side Scaling settings */
534 	u8 rss_key[AXGBE_RSS_HASH_KEY_SIZE];
535 	uint32_t rss_table[AXGBE_RSS_MAX_TABLE_SIZE];
536 	uint32_t rss_options;
537 	int rss_enable;
538 
539 	/* Hardware features of the device */
540 	struct axgbe_hw_features hw_feat;
541 
542 	struct rte_ether_addr mac_addr;
543 
544 	/* Software Tx/Rx structure pointers*/
545 	void **rx_queues;
546 	void **tx_queues;
547 
548 	/* MDIO/PHY related settings */
549 	unsigned int phy_started;
550 	void *phy_data;
551 	struct axgbe_phy phy;
552 	int mdio_mmd;
553 	unsigned long link_check;
554 	volatile int mdio_completion;
555 
556 	unsigned int kr_redrv;
557 
558 	/* Auto-negotiation atate machine support */
559 	unsigned int an_int;
560 	unsigned int an_status;
561 	enum axgbe_an an_result;
562 	enum axgbe_an an_state;
563 	enum axgbe_rx kr_state;
564 	enum axgbe_rx kx_state;
565 	unsigned int an_supported;
566 	unsigned int parallel_detect;
567 	unsigned int fec_ability;
568 	unsigned long an_start;
569 	enum axgbe_an_mode an_mode;
570 
571 	/* I2C support */
572 	struct axgbe_i2c i2c;
573 	volatile int i2c_complete;
574 
575 	/* CRC stripping by H/w for Rx packet*/
576 	int crc_strip_enable;
577 	/* csum enable to hardware */
578 	uint32_t rx_csum_enable;
579 };
580 
581 void axgbe_init_function_ptrs_dev(struct axgbe_hw_if *hw_if);
582 void axgbe_init_function_ptrs_phy(struct axgbe_phy_if *phy_if);
583 void axgbe_init_function_ptrs_phy_v2(struct axgbe_phy_if *phy_if);
584 void axgbe_init_function_ptrs_i2c(struct axgbe_i2c_if *i2c_if);
585 
586 #endif /* RTE_ETH_AXGBE_H_ */
587