Commit d64e78c9 authored by David S. Miller's avatar David S. Miller

Merge branch 'cxgb4-dcb'

Anish Bhatt says:

====================
cxgb4 DCB updates

The following patchset covers changes to work better with  the userspace
tools cgdcbxd and cgrulesengd and improves firmware support for
host-managed mode.

Also exports traffic class information that was previously not being
exported via dcbnl_ops and unfifies how app selector information is passed
to firmware.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents b52effd2 397665da
...@@ -31,6 +31,15 @@ static const char * const dcb_ver_array[] = { ...@@ -31,6 +31,15 @@ static const char * const dcb_ver_array[] = {
"Auto Negotiated" "Auto Negotiated"
}; };
static inline bool cxgb4_dcb_state_synced(enum cxgb4_dcb_state state)
{
if (state == CXGB4_DCB_STATE_FW_ALLSYNCED ||
state == CXGB4_DCB_STATE_HOST)
return true;
else
return false;
}
/* Initialize a port's Data Center Bridging state. Typically used after a /* Initialize a port's Data Center Bridging state. Typically used after a
* Link Down event. * Link Down event.
*/ */
...@@ -603,7 +612,7 @@ static void cxgb4_getpfccfg(struct net_device *dev, int priority, u8 *pfccfg) ...@@ -603,7 +612,7 @@ static void cxgb4_getpfccfg(struct net_device *dev, int priority, u8 *pfccfg)
struct port_info *pi = netdev2pinfo(dev); struct port_info *pi = netdev2pinfo(dev);
struct port_dcb_info *dcb = &pi->dcb; struct port_dcb_info *dcb = &pi->dcb;
if (dcb->state != CXGB4_DCB_STATE_FW_ALLSYNCED || if (!cxgb4_dcb_state_synced(dcb->state) ||
priority >= CXGB4_MAX_PRIORITY) priority >= CXGB4_MAX_PRIORITY)
*pfccfg = 0; *pfccfg = 0;
else else
...@@ -620,7 +629,7 @@ static void cxgb4_setpfccfg(struct net_device *dev, int priority, u8 pfccfg) ...@@ -620,7 +629,7 @@ static void cxgb4_setpfccfg(struct net_device *dev, int priority, u8 pfccfg)
struct adapter *adap = pi->adapter; struct adapter *adap = pi->adapter;
int err; int err;
if (pi->dcb.state != CXGB4_DCB_STATE_FW_ALLSYNCED || if (!cxgb4_dcb_state_synced(pi->dcb.state) ||
priority >= CXGB4_MAX_PRIORITY) priority >= CXGB4_MAX_PRIORITY)
return; return;
...@@ -732,7 +741,7 @@ static u8 cxgb4_getpfcstate(struct net_device *dev) ...@@ -732,7 +741,7 @@ static u8 cxgb4_getpfcstate(struct net_device *dev)
{ {
struct port_info *pi = netdev2pinfo(dev); struct port_info *pi = netdev2pinfo(dev);
if (pi->dcb.state != CXGB4_DCB_STATE_FW_ALLSYNCED) if (!cxgb4_dcb_state_synced(pi->dcb.state))
return false; return false;
return pi->dcb.pfcen != 0; return pi->dcb.pfcen != 0;
...@@ -756,7 +765,7 @@ static int __cxgb4_getapp(struct net_device *dev, u8 app_idtype, u16 app_id, ...@@ -756,7 +765,7 @@ static int __cxgb4_getapp(struct net_device *dev, u8 app_idtype, u16 app_id,
struct adapter *adap = pi->adapter; struct adapter *adap = pi->adapter;
int i; int i;
if (pi->dcb.state != CXGB4_DCB_STATE_FW_ALLSYNCED) if (!cxgb4_dcb_state_synced(pi->dcb.state))
return 0; return 0;
for (i = 0; i < CXGB4_MAX_DCBX_APP_SUPPORTED; i++) { for (i = 0; i < CXGB4_MAX_DCBX_APP_SUPPORTED; i++) {
...@@ -794,7 +803,9 @@ static int __cxgb4_getapp(struct net_device *dev, u8 app_idtype, u16 app_id, ...@@ -794,7 +803,9 @@ static int __cxgb4_getapp(struct net_device *dev, u8 app_idtype, u16 app_id,
*/ */
static int cxgb4_getapp(struct net_device *dev, u8 app_idtype, u16 app_id) static int cxgb4_getapp(struct net_device *dev, u8 app_idtype, u16 app_id)
{ {
return __cxgb4_getapp(dev, app_idtype, app_id, 0); /* Convert app_idtype to firmware format before querying */
return __cxgb4_getapp(dev, app_idtype == DCB_APP_IDTYPE_ETHTYPE ?
app_idtype : 3, app_id, 0);
} }
/* Write a new Application User Priority Map for the specified Application ID /* Write a new Application User Priority Map for the specified Application ID
...@@ -808,7 +819,7 @@ static int __cxgb4_setapp(struct net_device *dev, u8 app_idtype, u16 app_id, ...@@ -808,7 +819,7 @@ static int __cxgb4_setapp(struct net_device *dev, u8 app_idtype, u16 app_id,
int i, err; int i, err;
if (pi->dcb.state != CXGB4_DCB_STATE_FW_ALLSYNCED) if (!cxgb4_dcb_state_synced(pi->dcb.state))
return -EINVAL; return -EINVAL;
/* DCB info gets thrown away on link up */ /* DCB info gets thrown away on link up */
...@@ -896,10 +907,11 @@ cxgb4_ieee_negotiation_complete(struct net_device *dev, ...@@ -896,10 +907,11 @@ cxgb4_ieee_negotiation_complete(struct net_device *dev,
struct port_info *pi = netdev2pinfo(dev); struct port_info *pi = netdev2pinfo(dev);
struct port_dcb_info *dcb = &pi->dcb; struct port_dcb_info *dcb = &pi->dcb;
if (dcb_subtype && !(dcb->msgs & dcb_subtype)) if (dcb->state == CXGB4_DCB_STATE_FW_ALLSYNCED)
return 0; if (dcb_subtype && !(dcb->msgs & dcb_subtype))
return 0;
return (dcb->state == CXGB4_DCB_STATE_FW_ALLSYNCED && return (cxgb4_dcb_state_synced(dcb->state) &&
(dcb->supported & DCB_CAP_DCBX_VER_IEEE)); (dcb->supported & DCB_CAP_DCBX_VER_IEEE));
} }
...@@ -1057,7 +1069,7 @@ static u8 cxgb4_setdcbx(struct net_device *dev, u8 dcb_request) ...@@ -1057,7 +1069,7 @@ static u8 cxgb4_setdcbx(struct net_device *dev, u8 dcb_request)
/* Can't enable DCB if we haven't successfully negotiated it. /* Can't enable DCB if we haven't successfully negotiated it.
*/ */
if (pi->dcb.state != CXGB4_DCB_STATE_FW_ALLSYNCED) if (!cxgb4_dcb_state_synced(pi->dcb.state))
return 1; return 1;
/* There's currently no mechanism to allow for the firmware DCBX /* There's currently no mechanism to allow for the firmware DCBX
...@@ -1080,7 +1092,7 @@ static int cxgb4_getpeer_app(struct net_device *dev, ...@@ -1080,7 +1092,7 @@ static int cxgb4_getpeer_app(struct net_device *dev,
struct adapter *adap = pi->adapter; struct adapter *adap = pi->adapter;
int i, err = 0; int i, err = 0;
if (pi->dcb.state != CXGB4_DCB_STATE_FW_ALLSYNCED) if (!cxgb4_dcb_state_synced(pi->dcb.state))
return 1; return 1;
info->willing = 0; info->willing = 0;
...@@ -1114,7 +1126,7 @@ static int cxgb4_getpeerapp_tbl(struct net_device *dev, struct dcb_app *table) ...@@ -1114,7 +1126,7 @@ static int cxgb4_getpeerapp_tbl(struct net_device *dev, struct dcb_app *table)
struct adapter *adap = pi->adapter; struct adapter *adap = pi->adapter;
int i, err = 0; int i, err = 0;
if (pi->dcb.state != CXGB4_DCB_STATE_FW_ALLSYNCED) if (!cxgb4_dcb_state_synced(pi->dcb.state))
return 1; return 1;
for (i = 0; i < CXGB4_MAX_DCBX_APP_SUPPORTED; i++) { for (i = 0; i < CXGB4_MAX_DCBX_APP_SUPPORTED; i++) {
...@@ -1133,7 +1145,7 @@ static int cxgb4_getpeerapp_tbl(struct net_device *dev, struct dcb_app *table) ...@@ -1133,7 +1145,7 @@ static int cxgb4_getpeerapp_tbl(struct net_device *dev, struct dcb_app *table)
if (!pcmd.u.dcb.app_priority.protocolid) if (!pcmd.u.dcb.app_priority.protocolid)
break; break;
table[i].selector = pcmd.u.dcb.app_priority.sel_field; table[i].selector = (pcmd.u.dcb.app_priority.sel_field + 1);
table[i].protocol = table[i].protocol =
be16_to_cpu(pcmd.u.dcb.app_priority.protocolid); be16_to_cpu(pcmd.u.dcb.app_priority.protocolid);
table[i].priority = table[i].priority =
...@@ -1181,6 +1193,8 @@ static int cxgb4_cee_peer_getpg(struct net_device *dev, struct cee_pg *pg) ...@@ -1181,6 +1193,8 @@ static int cxgb4_cee_peer_getpg(struct net_device *dev, struct cee_pg *pg)
for (i = 0; i < CXGB4_MAX_PRIORITY; i++) for (i = 0; i < CXGB4_MAX_PRIORITY; i++)
pg->pg_bw[i] = pcmd.u.dcb.pgrate.pgrate[i]; pg->pg_bw[i] = pcmd.u.dcb.pgrate.pgrate[i];
pg->tcs_supported = pcmd.u.dcb.pgrate.num_tcs_supported;
return 0; return 0;
} }
...@@ -1198,6 +1212,8 @@ static int cxgb4_cee_peer_getpfc(struct net_device *dev, struct cee_pfc *pfc) ...@@ -1198,6 +1212,8 @@ static int cxgb4_cee_peer_getpfc(struct net_device *dev, struct cee_pfc *pfc)
*/ */
pfc->pfc_en = bitswap_1(pi->dcb.pfcen); pfc->pfc_en = bitswap_1(pi->dcb.pfcen);
pfc->tcs_supported = pi->dcb.pfc_num_tcs_supported;
return 0; return 0;
} }
......
...@@ -1137,7 +1137,7 @@ cxgb_fcoe_offload(struct sk_buff *skb, struct adapter *adap, ...@@ -1137,7 +1137,7 @@ cxgb_fcoe_offload(struct sk_buff *skb, struct adapter *adap,
*/ */
netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev) netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
u32 wr_mid; u32 wr_mid, ctrl0;
u64 cntrl, *end; u64 cntrl, *end;
int qidx, credits; int qidx, credits;
unsigned int flits, ndesc; unsigned int flits, ndesc;
...@@ -1274,9 +1274,15 @@ out_free: dev_kfree_skb_any(skb); ...@@ -1274,9 +1274,15 @@ out_free: dev_kfree_skb_any(skb);
#endif /* CONFIG_CHELSIO_T4_FCOE */ #endif /* CONFIG_CHELSIO_T4_FCOE */
} }
cpl->ctrl0 = htonl(TXPKT_OPCODE_V(CPL_TX_PKT_XT) | ctrl0 = TXPKT_OPCODE_V(CPL_TX_PKT_XT) | TXPKT_INTF_V(pi->tx_chan) |
TXPKT_INTF_V(pi->tx_chan) | TXPKT_PF_V(adap->pf);
TXPKT_PF_V(adap->pf)); #ifdef CONFIG_CHELSIO_T4_DCB
if (is_t4(adap->params.chip))
ctrl0 |= TXPKT_OVLAN_IDX_V(q->dcb_prio);
else
ctrl0 |= TXPKT_T5_OVLAN_IDX_V(q->dcb_prio);
#endif
cpl->ctrl0 = htonl(ctrl0);
cpl->pack = htons(0); cpl->pack = htons(0);
cpl->len = htons(skb->len); cpl->len = htons(skb->len);
cpl->ctrl1 = cpu_to_be64(cntrl); cpl->ctrl1 = cpu_to_be64(cntrl);
......
...@@ -660,6 +660,9 @@ struct cpl_tx_pkt { ...@@ -660,6 +660,9 @@ struct cpl_tx_pkt {
#define TXPKT_OVLAN_IDX_S 12 #define TXPKT_OVLAN_IDX_S 12
#define TXPKT_OVLAN_IDX_V(x) ((x) << TXPKT_OVLAN_IDX_S) #define TXPKT_OVLAN_IDX_V(x) ((x) << TXPKT_OVLAN_IDX_S)
#define TXPKT_T5_OVLAN_IDX_S 12
#define TXPKT_T5_OVLAN_IDX_V(x) ((x) << TXPKT_T5_OVLAN_IDX_S)
#define TXPKT_INTF_S 16 #define TXPKT_INTF_S 16
#define TXPKT_INTF_V(x) ((x) << TXPKT_INTF_S) #define TXPKT_INTF_V(x) ((x) << TXPKT_INTF_S)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment