1 // SPDX-License-Identifier: GPL-2.0+
2 // Copyright (c) 2016-2017 Hisilicon Limited.
7 /* Names used in this framework:
9 * a set of queues provided by AE
10 * ring buffer queue (rbq):
11 * the channel between upper layer and the AE, can do tx and rx
13 * a tx or rx channel within a rbq
14 * ring description (desc):
15 * an element in the ring with packet information
17 * a memory region referred by desc with the full packet payload
19 * "num" means a static number set as a parameter, "count" mean a dynamic
20 * number set while running
21 * "cb" means control block
24 #include <linux/acpi.h>
25 #include <linux/dcbnl.h>
26 #include <linux/delay.h>
27 #include <linux/device.h>
28 #include <linux/module.h>
29 #include <linux/netdevice.h>
30 #include <linux/pci.h>
31 #include <linux/types.h>
33 #define HNAE3_MOD_VERSION "1.0"
35 #define HNAE3_MIN_VECTOR_NUM 2 /* first one for misc, another for IO */
38 #define HNAE3_DEV_ID_GE 0xA220
39 #define HNAE3_DEV_ID_25GE 0xA221
40 #define HNAE3_DEV_ID_25GE_RDMA 0xA222
41 #define HNAE3_DEV_ID_25GE_RDMA_MACSEC 0xA223
42 #define HNAE3_DEV_ID_50GE_RDMA 0xA224
43 #define HNAE3_DEV_ID_50GE_RDMA_MACSEC 0xA225
44 #define HNAE3_DEV_ID_100G_RDMA_MACSEC 0xA226
45 #define HNAE3_DEV_ID_100G_VF 0xA22E
46 #define HNAE3_DEV_ID_100G_RDMA_DCB_PFC_VF 0xA22F
48 #define HNAE3_CLASS_NAME_SIZE 16
50 #define HNAE3_DEV_INITED_B 0x0
51 #define HNAE3_DEV_SUPPORT_ROCE_B 0x1
52 #define HNAE3_DEV_SUPPORT_DCB_B 0x2
53 #define HNAE3_KNIC_CLIENT_INITED_B 0x3
54 #define HNAE3_UNIC_CLIENT_INITED_B 0x4
55 #define HNAE3_ROCE_CLIENT_INITED_B 0x5
56 #define HNAE3_DEV_SUPPORT_FD_B 0x6
57 #define HNAE3_DEV_SUPPORT_GRO_B 0x7
59 #define HNAE3_DEV_SUPPORT_ROCE_DCB_BITS (BIT(HNAE3_DEV_SUPPORT_DCB_B) |\
60 BIT(HNAE3_DEV_SUPPORT_ROCE_B))
62 #define hnae3_dev_roce_supported(hdev) \
63 hnae3_get_bit(hdev->ae_dev->flag, HNAE3_DEV_SUPPORT_ROCE_B)
65 #define hnae3_dev_dcb_supported(hdev) \
66 hnae3_get_bit(hdev->ae_dev->flag, HNAE3_DEV_SUPPORT_DCB_B)
68 #define hnae3_dev_fd_supported(hdev) \
69 hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B)
71 #define hnae3_dev_gro_supported(hdev) \
72 hnae3_get_bit((hdev)->ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B)
74 #define ring_ptr_move_fw(ring, p) \
75 ((ring)->p = ((ring)->p + 1) % (ring)->desc_num)
76 #define ring_ptr_move_bw(ring, p) \
77 ((ring)->p = ((ring)->p - 1 + (ring)->desc_num) % (ring)->desc_num)
87 void __iomem *io_base;
88 struct hnae3_ae_algo *ae_algo;
89 struct hnae3_handle *handle;
90 int tqp_index; /* index in a handle */
91 u32 buf_size; /* size for hnae_desc->addr, preset by AE */
92 u16 tx_desc_num;/* total number of tx desc */
93 u16 rx_desc_num;/* total number of rx desc */
99 HNAE3_LOOP_SERIAL_SERDES,
100 HNAE3_LOOP_PARALLEL_SERDES,
105 enum hnae3_client_type {
111 enum hnae3_media_type {
112 HNAE3_MEDIA_TYPE_UNKNOWN,
113 HNAE3_MEDIA_TYPE_FIBER,
114 HNAE3_MEDIA_TYPE_COPPER,
115 HNAE3_MEDIA_TYPE_BACKPLANE,
116 HNAE3_MEDIA_TYPE_NONE,
119 /* must be consistent with definition in firmware */
120 enum hnae3_module_type {
121 HNAE3_MODULE_TYPE_UNKNOWN = 0x00,
122 HNAE3_MODULE_TYPE_FIBRE_LR = 0x01,
123 HNAE3_MODULE_TYPE_FIBRE_SR = 0x02,
124 HNAE3_MODULE_TYPE_AOC = 0x03,
125 HNAE3_MODULE_TYPE_CR = 0x04,
126 HNAE3_MODULE_TYPE_KR = 0x05,
127 HNAE3_MODULE_TYPE_TP = 0x06,
131 enum hnae3_fec_mode {
138 enum hnae3_reset_notify_type {
143 HNAE3_RESTORE_CLIENT,
146 enum hnae3_reset_type {
149 HNAE3_VF_PF_FUNC_RESET,
159 enum hnae3_flr_state {
164 enum hnae3_port_base_vlan_state {
165 HNAE3_PORT_BASE_VLAN_DISABLE,
166 HNAE3_PORT_BASE_VLAN_ENABLE,
167 HNAE3_PORT_BASE_VLAN_MODIFY,
168 HNAE3_PORT_BASE_VLAN_NOCHANGE,
171 struct hnae3_vector_info {
176 #define HNAE3_RING_TYPE_B 0
177 #define HNAE3_RING_TYPE_TX 0
178 #define HNAE3_RING_TYPE_RX 1
179 #define HNAE3_RING_GL_IDX_S 0
180 #define HNAE3_RING_GL_IDX_M GENMASK(1, 0)
181 #define HNAE3_RING_GL_RX 0
182 #define HNAE3_RING_GL_TX 1
184 struct hnae3_ring_chain_node {
185 struct hnae3_ring_chain_node *next;
191 #define HNAE3_IS_TX_RING(node) \
192 (((node)->flag & (1 << HNAE3_RING_TYPE_B)) == HNAE3_RING_TYPE_TX)
194 struct hnae3_client_ops {
195 int (*init_instance)(struct hnae3_handle *handle);
196 void (*uninit_instance)(struct hnae3_handle *handle, bool reset);
197 void (*link_status_change)(struct hnae3_handle *handle, bool state);
198 int (*setup_tc)(struct hnae3_handle *handle, u8 tc);
199 int (*reset_notify)(struct hnae3_handle *handle,
200 enum hnae3_reset_notify_type type);
201 enum hnae3_reset_type (*process_hw_error)(struct hnae3_handle *handle);
204 #define HNAE3_CLIENT_NAME_LENGTH 16
205 struct hnae3_client {
206 char name[HNAE3_CLIENT_NAME_LENGTH];
208 enum hnae3_client_type type;
209 const struct hnae3_client_ops *ops;
210 struct list_head node;
213 struct hnae3_ae_dev {
214 struct pci_dev *pdev;
215 const struct hnae3_ae_ops *ops;
216 struct list_head node;
218 unsigned long hw_err_reset_req;
219 enum hnae3_reset_type reset_type;
223 /* This struct defines the operation on the handle.
225 * init_ae_dev(): (mandatory)
226 * Get PF configure from pci_dev and initialize PF hardware
228 * Disable PF device and release PF resource
230 * Register client to ae_dev
231 * unregister_client()
232 * Unregister client from ae_dev
234 * Enable the hardware
236 * Disable the hardware
238 * Inform the hclge that client has been started
240 * Inform the hclge that client has been stopped
242 * Get the carrier state of the back channel of the handle, 1 for ok, 0 for
244 * get_ksettings_an_result()
245 * Get negotiation status,speed and duplex
247 * Get media type of MAC
249 * Check target speed whether is supported
259 * get tx and rx of pause frame use
261 * set tx and rx of pause frame use
263 * set auto autonegotiation of pause frame use
265 * get auto autonegotiation of pause frame use
267 * restart autonegotiation
269 * halt/resume autonegotiation when autonegotiation on
270 * get_coalesce_usecs()
271 * get usecs to delay a TX interrupt after a packet is sent
272 * get_rx_max_coalesced_frames()
273 * get Maximum number of packets to be sent before a TX interrupt.
274 * set_coalesce_usecs()
275 * set usecs to delay a TX interrupt after a packet is sent
276 * set_coalesce_frames()
277 * set Maximum number of packets to be sent before a TX interrupt.
283 * Add unicast addr to mac table
285 * Remove unicast addr from mac table
287 * Set multicast address
289 * Add multicast address to mac table
291 * Remove multicast address from mac table
293 * Update Old network device statistics
294 * get_ethtool_stats()
295 * Get ethtool network device statistics
297 * Get a set of strings that describe the requested objects
299 * Get number of strings that @get_strings will write
300 * update_led_status()
301 * Update the led status
307 * Get the len of the regs dump
310 * get_rss_indir_size()
311 * Get rss indirection table size
317 * Get tc size of handle
319 * Get vector number and vector information
321 * Put the vector in hdev
322 * map_ring_to_vector()
323 * Map rings to vector
324 * unmap_ring_from_vector()
325 * Unmap rings from vector
329 * Get firmware version
331 * Get media typr of phy
332 * enable_vlan_filter()
335 * Set vlan filter config of Ports
336 * set_vf_vlan_filter()
337 * Set vlan filter config of vf
338 * restore_vlan_table()
339 * Restore vlan filter entries after reset
340 * enable_hw_strip_rxvtag()
341 * Enable/disable hardware strip vlan tag of packets received
343 * Enable/disable HW GRO
345 * Check the 5-tuples of flow, and create flow director rule
347 struct hnae3_ae_ops {
348 int (*init_ae_dev)(struct hnae3_ae_dev *ae_dev);
349 void (*uninit_ae_dev)(struct hnae3_ae_dev *ae_dev);
350 void (*flr_prepare)(struct hnae3_ae_dev *ae_dev);
351 void (*flr_done)(struct hnae3_ae_dev *ae_dev);
352 int (*init_client_instance)(struct hnae3_client *client,
353 struct hnae3_ae_dev *ae_dev);
354 void (*uninit_client_instance)(struct hnae3_client *client,
355 struct hnae3_ae_dev *ae_dev);
356 int (*start)(struct hnae3_handle *handle);
357 void (*stop)(struct hnae3_handle *handle);
358 int (*client_start)(struct hnae3_handle *handle);
359 void (*client_stop)(struct hnae3_handle *handle);
360 int (*get_status)(struct hnae3_handle *handle);
361 void (*get_ksettings_an_result)(struct hnae3_handle *handle,
362 u8 *auto_neg, u32 *speed, u8 *duplex);
364 int (*cfg_mac_speed_dup_h)(struct hnae3_handle *handle, int speed,
367 void (*get_media_type)(struct hnae3_handle *handle, u8 *media_type,
369 int (*check_port_speed)(struct hnae3_handle *handle, u32 speed);
370 void (*get_fec)(struct hnae3_handle *handle, u8 *fec_ability,
372 int (*set_fec)(struct hnae3_handle *handle, u32 fec_mode);
373 void (*adjust_link)(struct hnae3_handle *handle, int speed, int duplex);
374 int (*set_loopback)(struct hnae3_handle *handle,
375 enum hnae3_loop loop_mode, bool en);
377 int (*set_promisc_mode)(struct hnae3_handle *handle, bool en_uc_pmc,
379 int (*set_mtu)(struct hnae3_handle *handle, int new_mtu);
381 void (*get_pauseparam)(struct hnae3_handle *handle,
382 u32 *auto_neg, u32 *rx_en, u32 *tx_en);
383 int (*set_pauseparam)(struct hnae3_handle *handle,
384 u32 auto_neg, u32 rx_en, u32 tx_en);
386 int (*set_autoneg)(struct hnae3_handle *handle, bool enable);
387 int (*get_autoneg)(struct hnae3_handle *handle);
388 int (*restart_autoneg)(struct hnae3_handle *handle);
389 int (*halt_autoneg)(struct hnae3_handle *handle, bool halt);
391 void (*get_coalesce_usecs)(struct hnae3_handle *handle,
392 u32 *tx_usecs, u32 *rx_usecs);
393 void (*get_rx_max_coalesced_frames)(struct hnae3_handle *handle,
394 u32 *tx_frames, u32 *rx_frames);
395 int (*set_coalesce_usecs)(struct hnae3_handle *handle, u32 timeout);
396 int (*set_coalesce_frames)(struct hnae3_handle *handle,
397 u32 coalesce_frames);
398 void (*get_coalesce_range)(struct hnae3_handle *handle,
399 u32 *tx_frames_low, u32 *rx_frames_low,
400 u32 *tx_frames_high, u32 *rx_frames_high,
401 u32 *tx_usecs_low, u32 *rx_usecs_low,
402 u32 *tx_usecs_high, u32 *rx_usecs_high);
404 void (*get_mac_addr)(struct hnae3_handle *handle, u8 *p);
405 int (*set_mac_addr)(struct hnae3_handle *handle, void *p,
407 int (*do_ioctl)(struct hnae3_handle *handle,
408 struct ifreq *ifr, int cmd);
409 int (*add_uc_addr)(struct hnae3_handle *handle,
410 const unsigned char *addr);
411 int (*rm_uc_addr)(struct hnae3_handle *handle,
412 const unsigned char *addr);
413 int (*set_mc_addr)(struct hnae3_handle *handle, void *addr);
414 int (*add_mc_addr)(struct hnae3_handle *handle,
415 const unsigned char *addr);
416 int (*rm_mc_addr)(struct hnae3_handle *handle,
417 const unsigned char *addr);
418 void (*set_tso_stats)(struct hnae3_handle *handle, int enable);
419 void (*update_stats)(struct hnae3_handle *handle,
420 struct net_device_stats *net_stats);
421 void (*get_stats)(struct hnae3_handle *handle, u64 *data);
422 void (*get_mac_pause_stats)(struct hnae3_handle *handle, u64 *tx_cnt,
424 void (*get_strings)(struct hnae3_handle *handle,
425 u32 stringset, u8 *data);
426 int (*get_sset_count)(struct hnae3_handle *handle, int stringset);
428 void (*get_regs)(struct hnae3_handle *handle, u32 *version,
430 int (*get_regs_len)(struct hnae3_handle *handle);
432 u32 (*get_rss_key_size)(struct hnae3_handle *handle);
433 u32 (*get_rss_indir_size)(struct hnae3_handle *handle);
434 int (*get_rss)(struct hnae3_handle *handle, u32 *indir, u8 *key,
436 int (*set_rss)(struct hnae3_handle *handle, const u32 *indir,
437 const u8 *key, const u8 hfunc);
438 int (*set_rss_tuple)(struct hnae3_handle *handle,
439 struct ethtool_rxnfc *cmd);
440 int (*get_rss_tuple)(struct hnae3_handle *handle,
441 struct ethtool_rxnfc *cmd);
443 int (*get_tc_size)(struct hnae3_handle *handle);
445 int (*get_vector)(struct hnae3_handle *handle, u16 vector_num,
446 struct hnae3_vector_info *vector_info);
447 int (*put_vector)(struct hnae3_handle *handle, int vector_num);
448 int (*map_ring_to_vector)(struct hnae3_handle *handle,
450 struct hnae3_ring_chain_node *vr_chain);
451 int (*unmap_ring_from_vector)(struct hnae3_handle *handle,
453 struct hnae3_ring_chain_node *vr_chain);
455 int (*reset_queue)(struct hnae3_handle *handle, u16 queue_id);
456 u32 (*get_fw_version)(struct hnae3_handle *handle);
457 void (*get_mdix_mode)(struct hnae3_handle *handle,
458 u8 *tp_mdix_ctrl, u8 *tp_mdix);
460 void (*enable_vlan_filter)(struct hnae3_handle *handle, bool enable);
461 int (*set_vlan_filter)(struct hnae3_handle *handle, __be16 proto,
462 u16 vlan_id, bool is_kill);
463 int (*set_vf_vlan_filter)(struct hnae3_handle *handle, int vfid,
464 u16 vlan, u8 qos, __be16 proto);
465 int (*enable_hw_strip_rxvtag)(struct hnae3_handle *handle, bool enable);
466 void (*reset_event)(struct pci_dev *pdev, struct hnae3_handle *handle);
467 enum hnae3_reset_type (*get_reset_level)(struct hnae3_ae_dev *ae_dev,
468 unsigned long *addr);
469 void (*set_default_reset_request)(struct hnae3_ae_dev *ae_dev,
470 enum hnae3_reset_type rst_type);
471 void (*get_channels)(struct hnae3_handle *handle,
472 struct ethtool_channels *ch);
473 void (*get_tqps_and_rss_info)(struct hnae3_handle *h,
474 u16 *alloc_tqps, u16 *max_rss_size);
475 int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num,
476 bool rxfh_configured);
477 void (*get_flowctrl_adv)(struct hnae3_handle *handle,
479 int (*set_led_id)(struct hnae3_handle *handle,
480 enum ethtool_phys_id_state status);
481 void (*get_link_mode)(struct hnae3_handle *handle,
482 unsigned long *supported,
483 unsigned long *advertising);
484 int (*add_fd_entry)(struct hnae3_handle *handle,
485 struct ethtool_rxnfc *cmd);
486 int (*del_fd_entry)(struct hnae3_handle *handle,
487 struct ethtool_rxnfc *cmd);
488 void (*del_all_fd_entries)(struct hnae3_handle *handle,
490 int (*get_fd_rule_cnt)(struct hnae3_handle *handle,
491 struct ethtool_rxnfc *cmd);
492 int (*get_fd_rule_info)(struct hnae3_handle *handle,
493 struct ethtool_rxnfc *cmd);
494 int (*get_fd_all_rules)(struct hnae3_handle *handle,
495 struct ethtool_rxnfc *cmd, u32 *rule_locs);
496 int (*restore_fd_rules)(struct hnae3_handle *handle);
497 void (*enable_fd)(struct hnae3_handle *handle, bool enable);
498 int (*add_arfs_entry)(struct hnae3_handle *handle, u16 queue_id,
499 u16 flow_id, struct flow_keys *fkeys);
500 int (*dbg_run_cmd)(struct hnae3_handle *handle, const char *cmd_buf);
501 pci_ers_result_t (*handle_hw_ras_error)(struct hnae3_ae_dev *ae_dev);
502 bool (*get_hw_reset_stat)(struct hnae3_handle *handle);
503 bool (*ae_dev_resetting)(struct hnae3_handle *handle);
504 unsigned long (*ae_dev_reset_cnt)(struct hnae3_handle *handle);
505 int (*set_gro_en)(struct hnae3_handle *handle, bool enable);
506 u16 (*get_global_queue_id)(struct hnae3_handle *handle, u16 queue_id);
507 void (*set_timer_task)(struct hnae3_handle *handle, bool enable);
508 int (*mac_connect_phy)(struct hnae3_handle *handle);
509 void (*mac_disconnect_phy)(struct hnae3_handle *handle);
510 void (*restore_vlan_table)(struct hnae3_handle *handle);
513 struct hnae3_dcb_ops {
514 /* IEEE 802.1Qaz std */
515 int (*ieee_getets)(struct hnae3_handle *, struct ieee_ets *);
516 int (*ieee_setets)(struct hnae3_handle *, struct ieee_ets *);
517 int (*ieee_getpfc)(struct hnae3_handle *, struct ieee_pfc *);
518 int (*ieee_setpfc)(struct hnae3_handle *, struct ieee_pfc *);
520 /* DCBX configuration */
521 u8 (*getdcbx)(struct hnae3_handle *);
522 u8 (*setdcbx)(struct hnae3_handle *, u8);
524 int (*setup_tc)(struct hnae3_handle *, u8, u8 *);
527 struct hnae3_ae_algo {
528 const struct hnae3_ae_ops *ops;
529 struct list_head node;
530 const struct pci_device_id *pdev_id_table;
533 #define HNAE3_INT_NAME_LEN (IFNAMSIZ + 16)
534 #define HNAE3_ITR_COUNTDOWN_START 100
536 struct hnae3_tc_info {
537 u16 tqp_offset; /* TQP offset from base TQP */
538 u16 tqp_count; /* Total TQPs */
539 u8 tc; /* TC index */
540 bool enable; /* If this TC is enable or not */
543 #define HNAE3_MAX_TC 8
544 #define HNAE3_MAX_USER_PRIO 8
545 struct hnae3_knic_private_info {
546 struct net_device *netdev; /* Set by KNIC client when init instance */
547 u16 rss_size; /* Allocated RSS queues */
553 u8 num_tc; /* Total number of enabled TCs */
554 u8 prio_tc[HNAE3_MAX_USER_PRIO]; /* TC indexed by prio */
555 struct hnae3_tc_info tc_info[HNAE3_MAX_TC]; /* Idx of array is HW TC */
557 u16 num_tqps; /* total number of TQPs in this handle */
558 struct hnae3_queue **tqp; /* array base of all TQPs in this instance */
559 const struct hnae3_dcb_ops *dcb_ops;
562 enum pkt_hash_types rss_type;
565 struct hnae3_roce_private_info {
566 struct net_device *netdev;
567 void __iomem *roce_io_base;
571 /* The below attributes defined for RoCE client, hnae3 gives
572 * initial values to them, and RoCE client can modify and use
575 unsigned long reset_state;
576 unsigned long instance_state;
580 struct hnae3_unic_private_info {
581 struct net_device *netdev;
586 u16 num_tqps; /* total number of tqps in this handle */
587 struct hnae3_queue **tqp; /* array base of all TQPs of this instance */
590 #define HNAE3_SUPPORT_APP_LOOPBACK BIT(0)
591 #define HNAE3_SUPPORT_PHY_LOOPBACK BIT(1)
592 #define HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK BIT(2)
593 #define HNAE3_SUPPORT_VF BIT(3)
594 #define HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK BIT(4)
596 #define HNAE3_USER_UPE BIT(0) /* unicast promisc enabled by user */
597 #define HNAE3_USER_MPE BIT(1) /* mulitcast promisc enabled by user */
598 #define HNAE3_BPE BIT(2) /* broadcast promisc enable */
599 #define HNAE3_OVERFLOW_UPE BIT(3) /* unicast mac vlan overflow */
600 #define HNAE3_OVERFLOW_MPE BIT(4) /* multicast mac vlan overflow */
601 #define HNAE3_VLAN_FLTR BIT(5) /* enable vlan filter */
602 #define HNAE3_UPE (HNAE3_USER_UPE | HNAE3_OVERFLOW_UPE)
603 #define HNAE3_MPE (HNAE3_USER_MPE | HNAE3_OVERFLOW_MPE)
605 struct hnae3_handle {
606 struct hnae3_client *client;
607 struct pci_dev *pdev;
609 struct hnae3_ae_algo *ae_algo; /* the class who provides this handle */
610 u64 flags; /* Indicate the capabilities for this handle*/
613 struct net_device *netdev; /* first member */
614 struct hnae3_knic_private_info kinfo;
615 struct hnae3_unic_private_info uinfo;
616 struct hnae3_roce_private_info rinfo;
619 u32 numa_node_mask; /* for multi-chip support */
621 enum hnae3_port_base_vlan_state port_base_vlan_state;
624 struct dentry *hnae3_dbgfs;
626 /* Network interface message level enabled bits */
630 #define hnae3_set_field(origin, mask, shift, val) \
632 (origin) &= (~(mask)); \
633 (origin) |= ((val) << (shift)) & (mask); \
635 #define hnae3_get_field(origin, mask, shift) (((origin) & (mask)) >> (shift))
637 #define hnae3_set_bit(origin, shift, val) \
638 hnae3_set_field((origin), (0x1 << (shift)), (shift), (val))
639 #define hnae3_get_bit(origin, shift) \
640 hnae3_get_field((origin), (0x1 << (shift)), (shift))
642 int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev);
643 void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev);
645 void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo);
646 void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo);
648 void hnae3_unregister_client(struct hnae3_client *client);
649 int hnae3_register_client(struct hnae3_client *client);
651 void hnae3_set_client_init_flag(struct hnae3_client *client,
652 struct hnae3_ae_dev *ae_dev,
653 unsigned int inited);