1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2014-2015 Hisilicon Limited.
6 #include <linux/acpi.h>
7 #include <linux/init.h>
8 #include <linux/interrupt.h>
9 #include <linux/kernel.h>
10 #include <linux/mfd/syscon.h>
11 #include <linux/module.h>
12 #include <linux/netdevice.h>
14 #include <linux/of_address.h>
15 #include <linux/of_mdio.h>
16 #include <linux/phy.h>
17 #include <linux/platform_device.h>
19 #include "hns_dsaf_main.h"
20 #include "hns_dsaf_misc.h"
21 #include "hns_dsaf_rcb.h"
23 #define MAC_EN_FLAG_V 0xada0328
25 static const u16 mac_phy_to_speed
[] = {
26 [PHY_INTERFACE_MODE_MII
] = MAC_SPEED_100
,
27 [PHY_INTERFACE_MODE_GMII
] = MAC_SPEED_1000
,
28 [PHY_INTERFACE_MODE_SGMII
] = MAC_SPEED_1000
,
29 [PHY_INTERFACE_MODE_TBI
] = MAC_SPEED_1000
,
30 [PHY_INTERFACE_MODE_RMII
] = MAC_SPEED_100
,
31 [PHY_INTERFACE_MODE_RGMII
] = MAC_SPEED_1000
,
32 [PHY_INTERFACE_MODE_RGMII_ID
] = MAC_SPEED_1000
,
33 [PHY_INTERFACE_MODE_RGMII_RXID
] = MAC_SPEED_1000
,
34 [PHY_INTERFACE_MODE_RGMII_TXID
] = MAC_SPEED_1000
,
35 [PHY_INTERFACE_MODE_RTBI
] = MAC_SPEED_1000
,
36 [PHY_INTERFACE_MODE_XGMII
] = MAC_SPEED_10000
39 static const enum mac_mode g_mac_mode_100
[] = {
40 [PHY_INTERFACE_MODE_MII
] = MAC_MODE_MII_100
,
41 [PHY_INTERFACE_MODE_RMII
] = MAC_MODE_RMII_100
44 static const enum mac_mode g_mac_mode_1000
[] = {
45 [PHY_INTERFACE_MODE_GMII
] = MAC_MODE_GMII_1000
,
46 [PHY_INTERFACE_MODE_SGMII
] = MAC_MODE_SGMII_1000
,
47 [PHY_INTERFACE_MODE_TBI
] = MAC_MODE_TBI_1000
,
48 [PHY_INTERFACE_MODE_RGMII
] = MAC_MODE_RGMII_1000
,
49 [PHY_INTERFACE_MODE_RGMII_ID
] = MAC_MODE_RGMII_1000
,
50 [PHY_INTERFACE_MODE_RGMII_RXID
] = MAC_MODE_RGMII_1000
,
51 [PHY_INTERFACE_MODE_RGMII_TXID
] = MAC_MODE_RGMII_1000
,
52 [PHY_INTERFACE_MODE_RTBI
] = MAC_MODE_RTBI_1000
55 static enum mac_mode
hns_get_enet_interface(const struct hns_mac_cb
*mac_cb
)
57 switch (mac_cb
->max_speed
) {
59 return g_mac_mode_100
[mac_cb
->phy_if
];
61 return g_mac_mode_1000
[mac_cb
->phy_if
];
63 return MAC_MODE_XGMII_10000
;
65 return MAC_MODE_MII_100
;
69 static u32
hns_mac_link_anti_shake(struct mac_driver
*mac_ctrl_drv
)
71 #define HNS_MAC_LINK_WAIT_TIME 5
72 #define HNS_MAC_LINK_WAIT_CNT 40
77 if (!mac_ctrl_drv
->get_link_status
)
80 for (i
= 0; i
< HNS_MAC_LINK_WAIT_CNT
; i
++) {
81 msleep(HNS_MAC_LINK_WAIT_TIME
);
82 mac_ctrl_drv
->get_link_status(mac_ctrl_drv
, &link_status
);
90 void hns_mac_get_link_status(struct hns_mac_cb
*mac_cb
, u32
*link_status
)
92 struct mac_driver
*mac_ctrl_drv
;
95 mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
97 if (mac_ctrl_drv
->get_link_status
)
98 mac_ctrl_drv
->get_link_status(mac_ctrl_drv
, link_status
);
102 if (mac_cb
->media_type
== HNAE_MEDIA_TYPE_FIBER
) {
103 ret
= mac_cb
->dsaf_dev
->misc_op
->get_sfp_prsnt(mac_cb
,
106 *link_status
= *link_status
&& sfp_prsnt
;
108 /* for FIBER port, it may have a fake link up.
109 * when the link status changes from down to up, we need to do
110 * anti-shake. the anti-shake time is base on tests.
111 * only FIBER port need to do this.
113 if (*link_status
&& !mac_cb
->link
)
114 *link_status
= hns_mac_link_anti_shake(mac_ctrl_drv
);
117 mac_cb
->link
= *link_status
;
120 int hns_mac_get_port_info(struct hns_mac_cb
*mac_cb
,
121 u8
*auto_neg
, u16
*speed
, u8
*duplex
)
123 struct mac_driver
*mac_ctrl_drv
;
124 struct mac_info info
;
126 mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
128 if (!mac_ctrl_drv
->get_info
)
131 mac_ctrl_drv
->get_info(mac_ctrl_drv
, &info
);
133 *auto_neg
= info
.auto_neg
;
137 *duplex
= info
.duplex
;
143 *hns_mac_need_adjust_link - check is need change mac speed and duplex register
145 *@speed: phy device speed
146 *@duplex:phy device duplex
149 bool hns_mac_need_adjust_link(struct hns_mac_cb
*mac_cb
, int speed
, int duplex
)
151 struct mac_driver
*mac_ctrl_drv
;
153 mac_ctrl_drv
= (struct mac_driver
*)(mac_cb
->priv
.mac
);
155 if (mac_ctrl_drv
->need_adjust_link
)
156 return mac_ctrl_drv
->need_adjust_link(mac_ctrl_drv
,
157 (enum mac_speed
)speed
, duplex
);
162 void hns_mac_adjust_link(struct hns_mac_cb
*mac_cb
, int speed
, int duplex
)
165 struct mac_driver
*mac_ctrl_drv
;
167 mac_ctrl_drv
= (struct mac_driver
*)(mac_cb
->priv
.mac
);
169 mac_cb
->speed
= speed
;
170 mac_cb
->half_duplex
= !duplex
;
172 if (mac_ctrl_drv
->adjust_link
) {
173 ret
= mac_ctrl_drv
->adjust_link(mac_ctrl_drv
,
174 (enum mac_speed
)speed
, duplex
);
177 "adjust_link failed, %s mac%d ret = %#x!\n",
178 mac_cb
->dsaf_dev
->ae_dev
.name
,
179 mac_cb
->mac_id
, ret
);
186 *hns_mac_get_inner_port_num - get mac table inner port number
189 *@port_num:port number
192 int hns_mac_get_inner_port_num(struct hns_mac_cb
*mac_cb
, u8 vmid
, u8
*port_num
)
194 int q_num_per_vf
, vf_num_per_port
;
198 if (mac_cb
->dsaf_dev
->dsaf_mode
<= DSAF_MODE_ENABLE
) {
199 if (mac_cb
->mac_id
!= DSAF_MAX_PORT_NUM
) {
201 "input invalid, %s mac%d vmid%d !\n",
202 mac_cb
->dsaf_dev
->ae_dev
.name
,
203 mac_cb
->mac_id
, vmid
);
206 } else if (mac_cb
->dsaf_dev
->dsaf_mode
< DSAF_MODE_MAX
) {
207 if (mac_cb
->mac_id
>= DSAF_MAX_PORT_NUM
) {
209 "input invalid, %s mac%d vmid%d!\n",
210 mac_cb
->dsaf_dev
->ae_dev
.name
,
211 mac_cb
->mac_id
, vmid
);
215 dev_err(mac_cb
->dev
, "dsaf mode invalid, %s mac%d!\n",
216 mac_cb
->dsaf_dev
->ae_dev
.name
, mac_cb
->mac_id
);
220 if (vmid
>= mac_cb
->dsaf_dev
->rcb_common
[0]->max_vfn
) {
221 dev_err(mac_cb
->dev
, "input invalid, %s mac%d vmid%d !\n",
222 mac_cb
->dsaf_dev
->ae_dev
.name
, mac_cb
->mac_id
, vmid
);
226 q_num_per_vf
= mac_cb
->dsaf_dev
->rcb_common
[0]->max_q_per_vf
;
227 vf_num_per_port
= mac_cb
->dsaf_dev
->rcb_common
[0]->max_vfn
;
229 vm_queue_id
= vmid
* q_num_per_vf
+
230 vf_num_per_port
* q_num_per_vf
* mac_cb
->mac_id
;
232 switch (mac_cb
->dsaf_dev
->dsaf_mode
) {
233 case DSAF_MODE_ENABLE_FIX
:
236 case DSAF_MODE_DISABLE_FIX
:
239 case DSAF_MODE_ENABLE_0VM
:
240 case DSAF_MODE_ENABLE_8VM
:
241 case DSAF_MODE_ENABLE_16VM
:
242 case DSAF_MODE_ENABLE_32VM
:
243 case DSAF_MODE_ENABLE_128VM
:
244 case DSAF_MODE_DISABLE_2PORT_8VM
:
245 case DSAF_MODE_DISABLE_2PORT_16VM
:
246 case DSAF_MODE_DISABLE_2PORT_64VM
:
247 case DSAF_MODE_DISABLE_6PORT_0VM
:
248 case DSAF_MODE_DISABLE_6PORT_2VM
:
249 case DSAF_MODE_DISABLE_6PORT_4VM
:
250 case DSAF_MODE_DISABLE_6PORT_16VM
:
251 tmp_port
= vm_queue_id
;
254 dev_err(mac_cb
->dev
, "dsaf mode invalid, %s mac%d!\n",
255 mac_cb
->dsaf_dev
->ae_dev
.name
, mac_cb
->mac_id
);
258 tmp_port
+= DSAF_BASE_INNER_PORT_NUM
;
260 *port_num
= tmp_port
;
266 *hns_mac_change_vf_addr - change vf mac address
271 int hns_mac_change_vf_addr(struct hns_mac_cb
*mac_cb
,
272 u32 vmid
, const char *addr
)
275 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
276 struct dsaf_device
*dsaf_dev
= mac_cb
->dsaf_dev
;
277 struct dsaf_drv_mac_single_dest_entry mac_entry
;
278 struct mac_entry_idx
*old_entry
;
280 old_entry
= &mac_cb
->addr_entry_idx
[vmid
];
281 if (!HNS_DSAF_IS_DEBUG(dsaf_dev
)) {
282 memcpy(mac_entry
.addr
, addr
, sizeof(mac_entry
.addr
));
283 mac_entry
.in_vlan_id
= old_entry
->vlan_id
;
284 mac_entry
.in_port_num
= mac_cb
->mac_id
;
285 ret
= hns_mac_get_inner_port_num(mac_cb
, (u8
)vmid
,
286 &mac_entry
.port_num
);
290 if ((old_entry
->valid
!= 0) &&
291 (memcmp(old_entry
->addr
,
292 addr
, sizeof(mac_entry
.addr
)) != 0)) {
293 ret
= hns_dsaf_del_mac_entry(dsaf_dev
,
301 ret
= hns_dsaf_set_mac_uc_entry(dsaf_dev
, &mac_entry
);
306 if ((mac_ctrl_drv
->set_mac_addr
) && (vmid
== 0))
307 mac_ctrl_drv
->set_mac_addr(mac_cb
->priv
.mac
, addr
);
309 memcpy(old_entry
->addr
, addr
, sizeof(old_entry
->addr
));
310 old_entry
->valid
= 1;
314 int hns_mac_add_uc_addr(struct hns_mac_cb
*mac_cb
, u8 vf_id
,
315 const unsigned char *addr
)
317 struct dsaf_device
*dsaf_dev
= mac_cb
->dsaf_dev
;
318 struct dsaf_drv_mac_single_dest_entry mac_entry
;
321 if (HNS_DSAF_IS_DEBUG(dsaf_dev
))
324 memset(&mac_entry
, 0, sizeof(mac_entry
));
325 memcpy(mac_entry
.addr
, addr
, sizeof(mac_entry
.addr
));
326 mac_entry
.in_port_num
= mac_cb
->mac_id
;
327 ret
= hns_mac_get_inner_port_num(mac_cb
, vf_id
, &mac_entry
.port_num
);
331 return hns_dsaf_set_mac_uc_entry(dsaf_dev
, &mac_entry
);
334 int hns_mac_rm_uc_addr(struct hns_mac_cb
*mac_cb
, u8 vf_id
,
335 const unsigned char *addr
)
337 struct dsaf_device
*dsaf_dev
= mac_cb
->dsaf_dev
;
338 struct dsaf_drv_mac_single_dest_entry mac_entry
;
341 if (HNS_DSAF_IS_DEBUG(dsaf_dev
))
344 memset(&mac_entry
, 0, sizeof(mac_entry
));
345 memcpy(mac_entry
.addr
, addr
, sizeof(mac_entry
.addr
));
346 mac_entry
.in_port_num
= mac_cb
->mac_id
;
347 ret
= hns_mac_get_inner_port_num(mac_cb
, vf_id
, &mac_entry
.port_num
);
351 return hns_dsaf_rm_mac_addr(dsaf_dev
, &mac_entry
);
354 int hns_mac_set_multi(struct hns_mac_cb
*mac_cb
,
355 u32 port_num
, char *addr
, bool enable
)
358 struct dsaf_device
*dsaf_dev
= mac_cb
->dsaf_dev
;
359 struct dsaf_drv_mac_single_dest_entry mac_entry
;
361 if (!HNS_DSAF_IS_DEBUG(dsaf_dev
) && addr
) {
362 memcpy(mac_entry
.addr
, addr
, sizeof(mac_entry
.addr
));
363 mac_entry
.in_vlan_id
= 0;/*vlan_id;*/
364 mac_entry
.in_port_num
= mac_cb
->mac_id
;
365 mac_entry
.port_num
= port_num
;
368 ret
= hns_dsaf_del_mac_mc_port(dsaf_dev
, &mac_entry
);
370 ret
= hns_dsaf_add_mac_mc_port(dsaf_dev
, &mac_entry
);
372 dev_err(dsaf_dev
->dev
,
373 "set mac mc port failed, %s mac%d ret = %#x!\n",
374 mac_cb
->dsaf_dev
->ae_dev
.name
,
375 mac_cb
->mac_id
, ret
);
383 int hns_mac_clr_multicast(struct hns_mac_cb
*mac_cb
, int vfn
)
385 struct dsaf_device
*dsaf_dev
= mac_cb
->dsaf_dev
;
387 int ret
= hns_mac_get_inner_port_num(mac_cb
, vfn
, &port_num
);
392 return hns_dsaf_clr_mac_mc_port(dsaf_dev
, mac_cb
->mac_id
, port_num
);
395 static void hns_mac_param_get(struct mac_params
*param
,
396 struct hns_mac_cb
*mac_cb
)
398 param
->vaddr
= mac_cb
->vaddr
;
399 param
->mac_mode
= hns_get_enet_interface(mac_cb
);
400 ether_addr_copy(param
->addr
, mac_cb
->addr_entry_idx
[0].addr
);
401 param
->mac_id
= mac_cb
->mac_id
;
402 param
->dev
= mac_cb
->dev
;
406 * hns_mac_port_config_bc_en - set broadcast rx&tx enable
407 * @mac_cb: mac device
408 * @port_num: queue number
411 * return 0 - success , negative --fail
413 static int hns_mac_port_config_bc_en(struct hns_mac_cb
*mac_cb
,
414 u32 port_num
, u16 vlan_id
, bool enable
)
417 struct dsaf_device
*dsaf_dev
= mac_cb
->dsaf_dev
;
418 struct dsaf_drv_mac_single_dest_entry mac_entry
;
420 /* directy return ok in debug network mode */
421 if (mac_cb
->mac_type
== HNAE_PORT_DEBUG
)
424 if (!HNS_DSAF_IS_DEBUG(dsaf_dev
)) {
425 eth_broadcast_addr(mac_entry
.addr
);
426 mac_entry
.in_vlan_id
= vlan_id
;
427 mac_entry
.in_port_num
= mac_cb
->mac_id
;
428 mac_entry
.port_num
= port_num
;
431 ret
= hns_dsaf_del_mac_mc_port(dsaf_dev
, &mac_entry
);
433 ret
= hns_dsaf_add_mac_mc_port(dsaf_dev
, &mac_entry
);
441 * hns_mac_vm_config_bc_en - set broadcast rx&tx enable
442 * @mac_cb: mac device
445 * return 0 - success , negative --fail
447 int hns_mac_vm_config_bc_en(struct hns_mac_cb
*mac_cb
, u32 vmid
, bool enable
)
450 struct dsaf_device
*dsaf_dev
= mac_cb
->dsaf_dev
;
452 struct mac_entry_idx
*uc_mac_entry
;
453 struct dsaf_drv_mac_single_dest_entry mac_entry
;
455 if (mac_cb
->mac_type
== HNAE_PORT_DEBUG
)
458 uc_mac_entry
= &mac_cb
->addr_entry_idx
[vmid
];
460 if (!HNS_DSAF_IS_DEBUG(dsaf_dev
)) {
461 eth_broadcast_addr(mac_entry
.addr
);
462 mac_entry
.in_vlan_id
= uc_mac_entry
->vlan_id
;
463 mac_entry
.in_port_num
= mac_cb
->mac_id
;
464 ret
= hns_mac_get_inner_port_num(mac_cb
, vmid
, &port_num
);
467 mac_entry
.port_num
= port_num
;
470 ret
= hns_dsaf_del_mac_mc_port(dsaf_dev
, &mac_entry
);
472 ret
= hns_dsaf_add_mac_mc_port(dsaf_dev
, &mac_entry
);
479 int hns_mac_wait_fifo_clean(struct hns_mac_cb
*mac_cb
)
481 struct mac_driver
*drv
= hns_mac_get_drv(mac_cb
);
483 if (drv
->wait_fifo_clean
)
484 return drv
->wait_fifo_clean(drv
);
489 void hns_mac_reset(struct hns_mac_cb
*mac_cb
)
491 struct mac_driver
*drv
= hns_mac_get_drv(mac_cb
);
492 bool is_ver1
= AE_IS_VER1(mac_cb
->dsaf_dev
->dsaf_ver
);
496 if (drv
->config_max_frame_length
)
497 drv
->config_max_frame_length(drv
, mac_cb
->max_frm
);
499 if (drv
->set_tx_auto_pause_frames
)
500 drv
->set_tx_auto_pause_frames(drv
, mac_cb
->tx_pause_frm_time
);
502 if (drv
->set_an_mode
)
503 drv
->set_an_mode(drv
, 1);
505 if (drv
->mac_pausefrm_cfg
) {
506 if (mac_cb
->mac_type
== HNAE_PORT_DEBUG
)
507 drv
->mac_pausefrm_cfg(drv
, !is_ver1
, !is_ver1
);
508 else /* mac rx must disable, dsaf pfc close instead of it*/
509 drv
->mac_pausefrm_cfg(drv
, 0, 1);
513 int hns_mac_set_mtu(struct hns_mac_cb
*mac_cb
, u32 new_mtu
, u32 buf_size
)
515 struct mac_driver
*drv
= hns_mac_get_drv(mac_cb
);
516 u32 new_frm
= new_mtu
+ ETH_HLEN
+ ETH_FCS_LEN
+ VLAN_HLEN
;
518 if (new_frm
> HNS_RCB_RING_MAX_BD_PER_PKT
* buf_size
)
521 if (!drv
->config_max_frame_length
)
524 /* adjust max frame to be at least the size of a standard frame */
525 if (new_frm
< (ETH_FRAME_LEN
+ ETH_FCS_LEN
+ VLAN_HLEN
))
526 new_frm
= (ETH_FRAME_LEN
+ ETH_FCS_LEN
+ VLAN_HLEN
);
528 drv
->config_max_frame_length(drv
, new_frm
);
530 mac_cb
->max_frm
= new_frm
;
535 void hns_mac_start(struct hns_mac_cb
*mac_cb
)
537 struct mac_driver
*mac_drv
= hns_mac_get_drv(mac_cb
);
540 if (mac_drv
->mac_en_flg
== MAC_EN_FLAG_V
) {
541 /*plus 1 when the virtual mac has been enabled */
542 mac_drv
->virt_dev_num
+= 1;
546 if (mac_drv
->mac_enable
) {
547 mac_drv
->mac_enable(mac_cb
->priv
.mac
, MAC_COMM_MODE_RX_AND_TX
);
548 mac_drv
->mac_en_flg
= MAC_EN_FLAG_V
;
552 void hns_mac_stop(struct hns_mac_cb
*mac_cb
)
554 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
556 /*modified for virtualization */
557 if (mac_ctrl_drv
->virt_dev_num
> 0) {
558 mac_ctrl_drv
->virt_dev_num
-= 1;
559 if (mac_ctrl_drv
->virt_dev_num
> 0)
563 if (mac_ctrl_drv
->mac_disable
)
564 mac_ctrl_drv
->mac_disable(mac_cb
->priv
.mac
,
565 MAC_COMM_MODE_RX_AND_TX
);
567 mac_ctrl_drv
->mac_en_flg
= 0;
569 mac_cb
->dsaf_dev
->misc_op
->cpld_reset_led(mac_cb
);
573 * hns_mac_get_autoneg - get auto autonegotiation
574 * @mac_cb: mac control block
575 * @auto_neg: output pointer to autoneg result
576 * return 0 - success , negative --fail
578 void hns_mac_get_autoneg(struct hns_mac_cb
*mac_cb
, u32
*auto_neg
)
580 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
582 if (mac_ctrl_drv
->autoneg_stat
)
583 mac_ctrl_drv
->autoneg_stat(mac_ctrl_drv
, auto_neg
);
589 * hns_mac_get_pauseparam - set rx & tx pause parameter
590 * @mac_cb: mac control block
591 * @rx_en: rx enable status
592 * @tx_en: tx enable status
593 * return 0 - success , negative --fail
595 void hns_mac_get_pauseparam(struct hns_mac_cb
*mac_cb
, u32
*rx_en
, u32
*tx_en
)
597 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
599 if (mac_ctrl_drv
->get_pause_enable
) {
600 mac_ctrl_drv
->get_pause_enable(mac_ctrl_drv
, rx_en
, tx_en
);
608 * hns_mac_set_autoneg - set auto autonegotiation
609 * @mac_cb: mac control block
610 * @enable: enable or not
611 * return 0 - success , negative --fail
613 int hns_mac_set_autoneg(struct hns_mac_cb
*mac_cb
, u8 enable
)
615 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
617 if (mac_cb
->phy_if
== PHY_INTERFACE_MODE_XGMII
&& enable
) {
618 dev_err(mac_cb
->dev
, "enabling autoneg is not allowed!\n");
622 if (mac_ctrl_drv
->set_an_mode
)
623 mac_ctrl_drv
->set_an_mode(mac_ctrl_drv
, enable
);
629 * hns_mac_set_pauseparam - set rx & tx pause parameter
630 * @mac_cb: mac control block
631 * @rx_en: rx enable or not
632 * @tx_en: tx enable or not
633 * return 0 - success , negative --fail
635 int hns_mac_set_pauseparam(struct hns_mac_cb
*mac_cb
, u32 rx_en
, u32 tx_en
)
637 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
638 bool is_ver1
= AE_IS_VER1(mac_cb
->dsaf_dev
->dsaf_ver
);
640 if (mac_cb
->mac_type
== HNAE_PORT_DEBUG
) {
641 if (is_ver1
&& (tx_en
|| rx_en
)) {
642 dev_err(mac_cb
->dev
, "macv1 can't enable tx/rx_pause!\n");
647 if (mac_ctrl_drv
->mac_pausefrm_cfg
)
648 mac_ctrl_drv
->mac_pausefrm_cfg(mac_ctrl_drv
, rx_en
, tx_en
);
654 * hns_mac_init_ex - mac init
655 * @mac_cb: mac control block
656 * return 0 - success , negative --fail
658 static int hns_mac_init_ex(struct hns_mac_cb
*mac_cb
)
661 struct mac_params param
;
662 struct mac_driver
*drv
;
664 hns_dsaf_fix_mac_mode(mac_cb
);
666 memset(¶m
, 0, sizeof(struct mac_params
));
667 hns_mac_param_get(¶m
, mac_cb
);
669 if (MAC_SPEED_FROM_MODE(param
.mac_mode
) < MAC_SPEED_10000
)
670 drv
= (struct mac_driver
*)hns_gmac_config(mac_cb
, ¶m
);
672 drv
= (struct mac_driver
*)hns_xgmac_config(mac_cb
, ¶m
);
677 mac_cb
->priv
.mac
= (void *)drv
;
678 hns_mac_reset(mac_cb
);
680 hns_mac_adjust_link(mac_cb
, mac_cb
->speed
, !mac_cb
->half_duplex
);
682 ret
= hns_mac_port_config_bc_en(mac_cb
, mac_cb
->mac_id
, 0, true);
689 drv
->mac_free(mac_cb
->priv
.mac
);
690 mac_cb
->priv
.mac
= NULL
;
696 hns_mac_phy_parse_addr(struct device
*dev
, struct fwnode_handle
*fwnode
)
701 ret
= fwnode_property_read_u32(fwnode
, "phy-addr", &addr
);
703 dev_err(dev
, "has invalid PHY address ret:%d\n", ret
);
707 if (addr
>= PHY_MAX_ADDR
) {
708 dev_err(dev
, "PHY address %i is too large\n", addr
);
716 hns_mac_register_phydev(struct mii_bus
*mdio
, struct hns_mac_cb
*mac_cb
,
719 struct phy_device
*phy
;
720 const char *phy_type
;
724 rc
= fwnode_property_read_string(mac_cb
->fw_port
,
725 "phy-mode", &phy_type
);
729 if (!strcmp(phy_type
, phy_modes(PHY_INTERFACE_MODE_XGMII
)))
731 else if (!strcmp(phy_type
, phy_modes(PHY_INTERFACE_MODE_SGMII
)))
736 phy
= get_phy_device(mdio
, addr
, is_c45
);
737 if (IS_ERR_OR_NULL(phy
))
740 phy
->irq
= mdio
->irq
[addr
];
742 /* All data is now stored in the phy struct;
745 rc
= phy_device_register(phy
);
747 phy_device_free(phy
);
748 dev_err(&mdio
->dev
, "registered phy fail at address %i\n",
753 mac_cb
->phy_dev
= phy
;
755 dev_dbg(&mdio
->dev
, "registered phy at address %i\n", addr
);
760 static int hns_mac_register_phy(struct hns_mac_cb
*mac_cb
)
762 struct fwnode_reference_args args
;
763 struct platform_device
*pdev
;
764 struct mii_bus
*mii_bus
;
768 /* Loop over the child nodes and register a phy_device for each one */
769 if (!to_acpi_device_node(mac_cb
->fw_port
))
772 rc
= acpi_node_get_property_reference(
773 mac_cb
->fw_port
, "mdio-node", 0, &args
);
776 if (!is_acpi_device_node(args
.fwnode
))
779 addr
= hns_mac_phy_parse_addr(mac_cb
->dev
, mac_cb
->fw_port
);
783 /* dev address in adev */
784 pdev
= hns_dsaf_find_platform_device(args
.fwnode
);
786 dev_err(mac_cb
->dev
, "mac%d mdio pdev is NULL\n",
791 mii_bus
= platform_get_drvdata(pdev
);
794 "mac%d mdio is NULL, dsaf will probe again later\n",
796 return -EPROBE_DEFER
;
799 rc
= hns_mac_register_phydev(mii_bus
, mac_cb
, addr
);
801 dev_dbg(mac_cb
->dev
, "mac%d register phy addr:%d\n",
802 mac_cb
->mac_id
, addr
);
807 static void hns_mac_remove_phydev(struct hns_mac_cb
*mac_cb
)
809 if (!to_acpi_device_node(mac_cb
->fw_port
) || !mac_cb
->phy_dev
)
812 phy_device_remove(mac_cb
->phy_dev
);
813 phy_device_free(mac_cb
->phy_dev
);
815 mac_cb
->phy_dev
= NULL
;
818 #define MAC_MEDIA_TYPE_MAX_LEN 16
820 static const struct {
821 enum hnae_media_type value
;
823 } media_type_defs
[] = {
824 {HNAE_MEDIA_TYPE_UNKNOWN
, "unknown" },
825 {HNAE_MEDIA_TYPE_FIBER
, "fiber" },
826 {HNAE_MEDIA_TYPE_COPPER
, "copper" },
827 {HNAE_MEDIA_TYPE_BACKPLANE
, "backplane" },
831 *hns_mac_get_info - get mac information from device node
833 * return: 0 --success, negative --fail
835 static int hns_mac_get_info(struct hns_mac_cb
*mac_cb
)
837 struct device_node
*np
;
838 struct regmap
*syscon
;
839 struct of_phandle_args cpld_args
;
840 const char *media_type
;
844 mac_cb
->link
= false;
845 mac_cb
->half_duplex
= false;
846 mac_cb
->media_type
= HNAE_MEDIA_TYPE_UNKNOWN
;
847 mac_cb
->speed
= mac_phy_to_speed
[mac_cb
->phy_if
];
848 mac_cb
->max_speed
= mac_cb
->speed
;
850 if (mac_cb
->phy_if
== PHY_INTERFACE_MODE_SGMII
) {
851 mac_cb
->if_support
= MAC_GMAC_SUPPORTED
;
852 mac_cb
->if_support
|= SUPPORTED_1000baseT_Full
;
853 } else if (mac_cb
->phy_if
== PHY_INTERFACE_MODE_XGMII
) {
854 mac_cb
->if_support
= SUPPORTED_10000baseR_FEC
;
855 mac_cb
->if_support
|= SUPPORTED_10000baseKR_Full
;
858 mac_cb
->max_frm
= MAC_DEFAULT_MTU
;
859 mac_cb
->tx_pause_frm_time
= MAC_DEFAULT_PAUSE_TIME
;
860 mac_cb
->port_rst_off
= mac_cb
->mac_id
;
861 mac_cb
->port_mode_off
= 0;
863 /* if the dsaf node doesn't contain a port subnode, get phy-handle
866 if (!mac_cb
->fw_port
) {
867 np
= of_parse_phandle(mac_cb
->dev
->of_node
, "phy-handle",
869 mac_cb
->phy_dev
= of_phy_find_device(np
);
870 if (mac_cb
->phy_dev
) {
871 /* refcount is held by of_phy_find_device()
872 * if the phy_dev is found
874 put_device(&mac_cb
->phy_dev
->mdio
.dev
);
876 dev_dbg(mac_cb
->dev
, "mac%d phy_node: %pOFn\n",
884 if (is_of_node(mac_cb
->fw_port
)) {
885 /* parse property from port subnode in dsaf */
886 np
= of_parse_phandle(to_of_node(mac_cb
->fw_port
),
888 mac_cb
->phy_dev
= of_phy_find_device(np
);
889 if (mac_cb
->phy_dev
) {
890 /* refcount is held by of_phy_find_device()
891 * if the phy_dev is found
893 put_device(&mac_cb
->phy_dev
->mdio
.dev
);
894 dev_dbg(mac_cb
->dev
, "mac%d phy_node: %pOFn\n",
899 np
= of_parse_phandle(to_of_node(mac_cb
->fw_port
),
901 syscon
= syscon_node_to_regmap(np
);
903 if (IS_ERR_OR_NULL(syscon
)) {
904 dev_err(mac_cb
->dev
, "serdes-syscon is needed!\n");
907 mac_cb
->serdes_ctrl
= syscon
;
909 ret
= fwnode_property_read_u32(mac_cb
->fw_port
,
911 &mac_cb
->port_rst_off
);
914 "mac%d port-rst-offset not found, use default value.\n",
918 ret
= fwnode_property_read_u32(mac_cb
->fw_port
,
920 &mac_cb
->port_mode_off
);
923 "mac%d port-mode-offset not found, use default value.\n",
927 ret
= of_parse_phandle_with_fixed_args(
928 to_of_node(mac_cb
->fw_port
), "cpld-syscon", 1, 0,
931 dev_dbg(mac_cb
->dev
, "mac%d no cpld-syscon found.\n",
933 mac_cb
->cpld_ctrl
= NULL
;
935 syscon
= syscon_node_to_regmap(cpld_args
.np
);
936 of_node_put(cpld_args
.np
);
937 if (IS_ERR_OR_NULL(syscon
)) {
938 dev_dbg(mac_cb
->dev
, "no cpld-syscon found!\n");
939 mac_cb
->cpld_ctrl
= NULL
;
941 mac_cb
->cpld_ctrl
= syscon
;
942 mac_cb
->cpld_ctrl_reg
= cpld_args
.args
[0];
945 } else if (is_acpi_node(mac_cb
->fw_port
)) {
946 ret
= hns_mac_register_phy(mac_cb
);
947 /* Mac can work well if there is phy or not.If the port don't
948 * connect with phy, the return value will be ignored. Only
949 * when there is phy but can't find mdio bus, the return value
952 if (ret
== -EPROBE_DEFER
)
955 dev_err(mac_cb
->dev
, "mac%d cannot find phy node\n",
959 if (!fwnode_property_read_string(mac_cb
->fw_port
, "media-type",
961 for (i
= 0; i
< ARRAY_SIZE(media_type_defs
); i
++) {
962 if (!strncmp(media_type_defs
[i
].name
, media_type
,
963 MAC_MEDIA_TYPE_MAX_LEN
)) {
964 mac_cb
->media_type
= media_type_defs
[i
].value
;
970 if (fwnode_property_read_u8_array(mac_cb
->fw_port
, "mc-mac-mask",
971 mac_cb
->mc_mask
, ETH_ALEN
)) {
972 dev_warn(mac_cb
->dev
,
973 "no mc-mac-mask property, set to default value.\n");
974 eth_broadcast_addr(mac_cb
->mc_mask
);
981 * hns_mac_get_mode - get mac mode
982 * @phy_if: phy interface
983 * return 0 - gmac, 1 - xgmac , negative --fail
985 static int hns_mac_get_mode(phy_interface_t phy_if
)
988 case PHY_INTERFACE_MODE_SGMII
:
990 case PHY_INTERFACE_MODE_XGMII
:
991 return MAC_XGMAC_IDX
;
998 hns_mac_get_vaddr(struct dsaf_device
*dsaf_dev
,
999 struct hns_mac_cb
*mac_cb
, u32 mac_mode_idx
)
1001 u8 __iomem
*base
= dsaf_dev
->io_base
;
1002 int mac_id
= mac_cb
->mac_id
;
1004 if (mac_cb
->mac_type
== HNAE_PORT_SERVICE
)
1005 return base
+ 0x40000 + mac_id
* 0x4000 -
1006 mac_mode_idx
* 0x20000;
1008 return dsaf_dev
->ppe_base
+ 0x1000;
1012 * hns_mac_get_cfg - get mac cfg from dtb or acpi table
1013 * @dsaf_dev: dsa fabric device struct pointer
1014 * @mac_cb: mac control block
1015 * return 0 - success , negative --fail
1018 hns_mac_get_cfg(struct dsaf_device
*dsaf_dev
, struct hns_mac_cb
*mac_cb
)
1023 mac_cb
->dsaf_dev
= dsaf_dev
;
1024 mac_cb
->dev
= dsaf_dev
->dev
;
1026 mac_cb
->sys_ctl_vaddr
= dsaf_dev
->sc_base
;
1027 mac_cb
->serdes_vaddr
= dsaf_dev
->sds_base
;
1029 mac_cb
->sfp_prsnt
= 0;
1030 mac_cb
->txpkt_for_led
= 0;
1031 mac_cb
->rxpkt_for_led
= 0;
1033 if (!HNS_DSAF_IS_DEBUG(dsaf_dev
))
1034 mac_cb
->mac_type
= HNAE_PORT_SERVICE
;
1036 mac_cb
->mac_type
= HNAE_PORT_DEBUG
;
1038 mac_cb
->phy_if
= dsaf_dev
->misc_op
->get_phy_if(mac_cb
);
1040 ret
= hns_mac_get_mode(mac_cb
->phy_if
);
1042 dev_err(dsaf_dev
->dev
,
1043 "hns_mac_get_mode failed, mac%d ret = %#x!\n",
1044 mac_cb
->mac_id
, ret
);
1047 mac_mode_idx
= (u32
)ret
;
1049 ret
= hns_mac_get_info(mac_cb
);
1053 mac_cb
->dsaf_dev
->misc_op
->cpld_reset_led(mac_cb
);
1054 mac_cb
->vaddr
= hns_mac_get_vaddr(dsaf_dev
, mac_cb
, mac_mode_idx
);
1059 static int hns_mac_get_max_port_num(struct dsaf_device
*dsaf_dev
)
1061 if (HNS_DSAF_IS_DEBUG(dsaf_dev
))
1064 return DSAF_MAX_PORT_NUM
;
1067 void hns_mac_enable(struct hns_mac_cb
*mac_cb
, enum mac_commom_mode mode
)
1069 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
1071 mac_ctrl_drv
->mac_enable(mac_cb
->priv
.mac
, mode
);
1074 void hns_mac_disable(struct hns_mac_cb
*mac_cb
, enum mac_commom_mode mode
)
1076 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
1078 mac_ctrl_drv
->mac_disable(mac_cb
->priv
.mac
, mode
);
1082 * hns_mac_init - init mac
1083 * @dsaf_dev: dsa fabric device struct pointer
1084 * return 0 - success , negative --fail
1086 int hns_mac_init(struct dsaf_device
*dsaf_dev
)
1091 int max_port_num
= hns_mac_get_max_port_num(dsaf_dev
);
1092 struct hns_mac_cb
*mac_cb
;
1094 device_for_each_child_node_scoped(dsaf_dev
->dev
, child
) {
1095 ret
= fwnode_property_read_u32(child
, "reg", &port_id
);
1097 dev_err(dsaf_dev
->dev
,
1098 "get reg fail, ret=%d!\n", ret
);
1101 if (port_id
>= max_port_num
) {
1102 dev_err(dsaf_dev
->dev
,
1103 "reg(%u) out of range!\n", port_id
);
1106 mac_cb
= devm_kzalloc(dsaf_dev
->dev
, sizeof(*mac_cb
),
1111 mac_cb
->fw_port
= child
;
1112 mac_cb
->mac_id
= (u8
)port_id
;
1113 dsaf_dev
->mac_cb
[port_id
] = mac_cb
;
1117 /* if don't get any port subnode from dsaf node
1118 * will init all port then, this is compatible with the old dts
1121 for (port_id
= 0; port_id
< max_port_num
; port_id
++) {
1122 mac_cb
= devm_kzalloc(dsaf_dev
->dev
, sizeof(*mac_cb
),
1127 mac_cb
->mac_id
= port_id
;
1128 dsaf_dev
->mac_cb
[port_id
] = mac_cb
;
1132 /* init mac_cb for all port */
1133 for (port_id
= 0; port_id
< max_port_num
; port_id
++) {
1134 mac_cb
= dsaf_dev
->mac_cb
[port_id
];
1138 ret
= hns_mac_get_cfg(dsaf_dev
, mac_cb
);
1142 ret
= hns_mac_init_ex(mac_cb
);
1150 void hns_mac_uninit(struct dsaf_device
*dsaf_dev
)
1153 int max_port_num
= hns_mac_get_max_port_num(dsaf_dev
);
1155 for (i
= 0; i
< max_port_num
; i
++) {
1156 if (!dsaf_dev
->mac_cb
[i
])
1159 dsaf_dev
->misc_op
->cpld_reset_led(dsaf_dev
->mac_cb
[i
]);
1160 hns_mac_remove_phydev(dsaf_dev
->mac_cb
[i
]);
1161 dsaf_dev
->mac_cb
[i
] = NULL
;
1165 int hns_mac_config_mac_loopback(struct hns_mac_cb
*mac_cb
,
1166 enum hnae_loop loop
, int en
)
1169 struct mac_driver
*drv
= hns_mac_get_drv(mac_cb
);
1171 if (drv
->config_loopback
)
1172 ret
= drv
->config_loopback(drv
, loop
, en
);
1179 void hns_mac_update_stats(struct hns_mac_cb
*mac_cb
)
1181 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
1183 mac_ctrl_drv
->update_stats(mac_ctrl_drv
);
1186 void hns_mac_get_stats(struct hns_mac_cb
*mac_cb
, u64
*data
)
1188 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
1190 mac_ctrl_drv
->get_ethtool_stats(mac_ctrl_drv
, data
);
1193 void hns_mac_get_strings(struct hns_mac_cb
*mac_cb
, int stringset
, u8
**data
)
1195 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
1197 mac_ctrl_drv
->get_strings(stringset
, data
);
1200 int hns_mac_get_sset_count(struct hns_mac_cb
*mac_cb
, int stringset
)
1202 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
1204 return mac_ctrl_drv
->get_sset_count(stringset
);
1207 void hns_mac_set_promisc(struct hns_mac_cb
*mac_cb
, u8 en
)
1209 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
1211 hns_dsaf_set_promisc_tcam(mac_cb
->dsaf_dev
, mac_cb
->mac_id
, !!en
);
1213 if (mac_ctrl_drv
->set_promiscuous
)
1214 mac_ctrl_drv
->set_promiscuous(mac_ctrl_drv
, en
);
1217 int hns_mac_get_regs_count(struct hns_mac_cb
*mac_cb
)
1219 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
1221 return mac_ctrl_drv
->get_regs_count();
1224 void hns_mac_get_regs(struct hns_mac_cb
*mac_cb
, void *data
)
1226 struct mac_driver
*mac_ctrl_drv
= hns_mac_get_drv(mac_cb
);
1228 mac_ctrl_drv
->get_regs(mac_ctrl_drv
, data
);
1231 void hns_set_led_opt(struct hns_mac_cb
*mac_cb
)
1236 txpkts
= mac_cb
->txpkt_for_led
- mac_cb
->hw_stats
.tx_good_pkts
;
1237 rxpkts
= mac_cb
->rxpkt_for_led
- mac_cb
->hw_stats
.rx_good_pkts
;
1238 if (txpkts
|| rxpkts
)
1242 mac_cb
->txpkt_for_led
= mac_cb
->hw_stats
.tx_good_pkts
;
1243 mac_cb
->rxpkt_for_led
= mac_cb
->hw_stats
.rx_good_pkts
;
1244 mac_cb
->dsaf_dev
->misc_op
->cpld_set_led(mac_cb
, (int)mac_cb
->link
,
1245 mac_cb
->speed
, nic_data
);
1248 int hns_cpld_led_set_id(struct hns_mac_cb
*mac_cb
,
1249 enum hnae_led_state status
)
1254 return mac_cb
->dsaf_dev
->misc_op
->cpld_set_led_id(mac_cb
, status
);