mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-23 02:54:32 +08:00
Merge branch 'mlxsw-fixes'
Jiri Pirko says: ==================== mlxsw: Couple of fixes Couple of fixes for mlxsw driver from Ido. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
f57ec1889f
@ -2718,7 +2718,7 @@ static inline void mlxsw_reg_ppcnt_pack(char *payload, u8 local_port,
|
||||
* Configures the switch priority to buffer table.
|
||||
*/
|
||||
#define MLXSW_REG_PPTB_ID 0x500B
|
||||
#define MLXSW_REG_PPTB_LEN 0x0C
|
||||
#define MLXSW_REG_PPTB_LEN 0x10
|
||||
|
||||
static const struct mlxsw_reg_info mlxsw_reg_pptb = {
|
||||
.id = MLXSW_REG_PPTB_ID,
|
||||
@ -2784,6 +2784,13 @@ MLXSW_ITEM32(reg, pptb, pm_msb, 0x08, 24, 8);
|
||||
*/
|
||||
MLXSW_ITEM32(reg, pptb, untagged_buff, 0x08, 0, 4);
|
||||
|
||||
/* reg_pptb_prio_to_buff_msb
|
||||
* Mapping of switch priority <i+8> to one of the allocated receive port
|
||||
* buffers.
|
||||
* Access: RW
|
||||
*/
|
||||
MLXSW_ITEM_BIT_ARRAY(reg, pptb, prio_to_buff_msb, 0x0C, 0x04, 4);
|
||||
|
||||
#define MLXSW_REG_PPTB_ALL_PRIO 0xFF
|
||||
|
||||
static inline void mlxsw_reg_pptb_pack(char *payload, u8 local_port)
|
||||
@ -2792,6 +2799,14 @@ static inline void mlxsw_reg_pptb_pack(char *payload, u8 local_port)
|
||||
mlxsw_reg_pptb_mm_set(payload, MLXSW_REG_PPTB_MM_UM);
|
||||
mlxsw_reg_pptb_local_port_set(payload, local_port);
|
||||
mlxsw_reg_pptb_pm_set(payload, MLXSW_REG_PPTB_ALL_PRIO);
|
||||
mlxsw_reg_pptb_pm_msb_set(payload, MLXSW_REG_PPTB_ALL_PRIO);
|
||||
}
|
||||
|
||||
static inline void mlxsw_reg_pptb_prio_to_buff_pack(char *payload, u8 prio,
|
||||
u8 buff)
|
||||
{
|
||||
mlxsw_reg_pptb_prio_to_buff_set(payload, prio, buff);
|
||||
mlxsw_reg_pptb_prio_to_buff_msb_set(payload, prio, buff);
|
||||
}
|
||||
|
||||
/* PBMC - Port Buffer Management Control Register
|
||||
|
@ -171,23 +171,6 @@ static int mlxsw_sp_port_admin_status_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(paos), paos_pl);
|
||||
}
|
||||
|
||||
static int mlxsw_sp_port_oper_status_get(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
bool *p_is_up)
|
||||
{
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
char paos_pl[MLXSW_REG_PAOS_LEN];
|
||||
u8 oper_status;
|
||||
int err;
|
||||
|
||||
mlxsw_reg_paos_pack(paos_pl, mlxsw_sp_port->local_port, 0);
|
||||
err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(paos), paos_pl);
|
||||
if (err)
|
||||
return err;
|
||||
oper_status = mlxsw_reg_paos_oper_status_get(paos_pl);
|
||||
*p_is_up = oper_status == MLXSW_PORT_ADMIN_STATUS_UP ? true : false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlxsw_sp_port_dev_addr_set(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
unsigned char *addr)
|
||||
{
|
||||
@ -1434,7 +1417,8 @@ static int mlxsw_sp_port_get_settings(struct net_device *dev,
|
||||
|
||||
cmd->supported = mlxsw_sp_from_ptys_supported_port(eth_proto_cap) |
|
||||
mlxsw_sp_from_ptys_supported_link(eth_proto_cap) |
|
||||
SUPPORTED_Pause | SUPPORTED_Asym_Pause;
|
||||
SUPPORTED_Pause | SUPPORTED_Asym_Pause |
|
||||
SUPPORTED_Autoneg;
|
||||
cmd->advertising = mlxsw_sp_from_ptys_advert_link(eth_proto_admin);
|
||||
mlxsw_sp_from_ptys_speed_duplex(netif_carrier_ok(dev),
|
||||
eth_proto_oper, cmd);
|
||||
@ -1493,7 +1477,6 @@ static int mlxsw_sp_port_set_settings(struct net_device *dev,
|
||||
u32 eth_proto_new;
|
||||
u32 eth_proto_cap;
|
||||
u32 eth_proto_admin;
|
||||
bool is_up;
|
||||
int err;
|
||||
|
||||
speed = ethtool_cmd_speed(cmd);
|
||||
@ -1525,12 +1508,7 @@ static int mlxsw_sp_port_set_settings(struct net_device *dev,
|
||||
return err;
|
||||
}
|
||||
|
||||
err = mlxsw_sp_port_oper_status_get(mlxsw_sp_port, &is_up);
|
||||
if (err) {
|
||||
netdev_err(dev, "Failed to get oper status");
|
||||
return err;
|
||||
}
|
||||
if (!is_up)
|
||||
if (!netif_running(dev))
|
||||
return 0;
|
||||
|
||||
err = mlxsw_sp_port_admin_status_set(mlxsw_sp_port, false);
|
||||
|
@ -194,7 +194,7 @@ static int mlxsw_sp_port_pb_prio_init(struct mlxsw_sp_port *mlxsw_sp_port)
|
||||
|
||||
mlxsw_reg_pptb_pack(pptb_pl, mlxsw_sp_port->local_port);
|
||||
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
|
||||
mlxsw_reg_pptb_prio_to_buff_set(pptb_pl, i, 0);
|
||||
mlxsw_reg_pptb_prio_to_buff_pack(pptb_pl, i, 0);
|
||||
return mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb),
|
||||
pptb_pl);
|
||||
}
|
||||
|
@ -103,7 +103,8 @@ static int mlxsw_sp_port_pg_prio_map(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
|
||||
mlxsw_reg_pptb_pack(pptb_pl, mlxsw_sp_port->local_port);
|
||||
for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
|
||||
mlxsw_reg_pptb_prio_to_buff_set(pptb_pl, i, prio_tc[i]);
|
||||
mlxsw_reg_pptb_prio_to_buff_pack(pptb_pl, i, prio_tc[i]);
|
||||
|
||||
return mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb),
|
||||
pptb_pl);
|
||||
}
|
||||
@ -249,6 +250,7 @@ static int mlxsw_sp_dcbnl_ieee_setets(struct net_device *dev,
|
||||
return err;
|
||||
|
||||
memcpy(mlxsw_sp_port->dcb.ets, ets, sizeof(*ets));
|
||||
mlxsw_sp_port->dcb.ets->ets_cap = IEEE_8021QAZ_MAX_TCS;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -351,7 +353,8 @@ static int mlxsw_sp_dcbnl_ieee_setpfc(struct net_device *dev,
|
||||
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
if (mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause) {
|
||||
if ((mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause) &&
|
||||
pfc->pfc_en) {
|
||||
netdev_err(dev, "PAUSE frames already enabled on port\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -371,6 +374,7 @@ static int mlxsw_sp_dcbnl_ieee_setpfc(struct net_device *dev,
|
||||
}
|
||||
|
||||
memcpy(mlxsw_sp_port->dcb.pfc, pfc, sizeof(*pfc));
|
||||
mlxsw_sp_port->dcb.pfc->pfc_cap = IEEE_8021QAZ_MAX_TCS;
|
||||
|
||||
return 0;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user