aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c68
1 files changed, 43 insertions, 25 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index 4b875da1c7ed..4ccc806b1150 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -227,6 +227,12 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
227 --nbd; 227 --nbd;
228 bd_idx = TX_BD(NEXT_TX_IDX(bd_idx)); 228 bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
229 229
230 if (tx_buf->flags & BNX2X_HAS_SECOND_PBD) {
231 /* Skip second parse bd... */
232 --nbd;
233 bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
234 }
235
230 /* TSO headers+data bds share a common mapping. See bnx2x_tx_split() */ 236 /* TSO headers+data bds share a common mapping. See bnx2x_tx_split() */
231 if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) { 237 if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) {
232 tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd; 238 tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd;
@@ -477,11 +483,7 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue,
477 483
478#ifdef BNX2X_STOP_ON_ERROR 484#ifdef BNX2X_STOP_ON_ERROR
479 fp->tpa_queue_used |= (1 << queue); 485 fp->tpa_queue_used |= (1 << queue);
480#ifdef _ASM_GENERIC_INT_L64_H
481 DP(NETIF_MSG_RX_STATUS, "fp->tpa_queue_used = 0x%lx\n",
482#else
483 DP(NETIF_MSG_RX_STATUS, "fp->tpa_queue_used = 0x%llx\n", 486 DP(NETIF_MSG_RX_STATUS, "fp->tpa_queue_used = 0x%llx\n",
484#endif
485 fp->tpa_queue_used); 487 fp->tpa_queue_used);
486#endif 488#endif
487} 489}
@@ -1186,29 +1188,38 @@ u16 bnx2x_get_mf_speed(struct bnx2x *bp)
1186static void bnx2x_fill_report_data(struct bnx2x *bp, 1188static void bnx2x_fill_report_data(struct bnx2x *bp,
1187 struct bnx2x_link_report_data *data) 1189 struct bnx2x_link_report_data *data)
1188{ 1190{
1189 u16 line_speed = bnx2x_get_mf_speed(bp);
1190
1191 memset(data, 0, sizeof(*data)); 1191 memset(data, 0, sizeof(*data));
1192 1192
1193 /* Fill the report data: effective line speed */ 1193 if (IS_PF(bp)) {
1194 data->line_speed = line_speed; 1194 /* Fill the report data: effective line speed */
1195 1195 data->line_speed = bnx2x_get_mf_speed(bp);
1196 /* Link is down */ 1196
1197 if (!bp->link_vars.link_up || (bp->flags & MF_FUNC_DIS)) 1197 /* Link is down */
1198 __set_bit(BNX2X_LINK_REPORT_LINK_DOWN, 1198 if (!bp->link_vars.link_up || (bp->flags & MF_FUNC_DIS))
1199 &data->link_report_flags); 1199 __set_bit(BNX2X_LINK_REPORT_LINK_DOWN,
1200 1200 &data->link_report_flags);
1201 /* Full DUPLEX */ 1201
1202 if (bp->link_vars.duplex == DUPLEX_FULL) 1202 if (!BNX2X_NUM_ETH_QUEUES(bp))
1203 __set_bit(BNX2X_LINK_REPORT_FD, &data->link_report_flags); 1203 __set_bit(BNX2X_LINK_REPORT_LINK_DOWN,
1204 1204 &data->link_report_flags);
1205 /* Rx Flow Control is ON */ 1205
1206 if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_RX) 1206 /* Full DUPLEX */
1207 __set_bit(BNX2X_LINK_REPORT_RX_FC_ON, &data->link_report_flags); 1207 if (bp->link_vars.duplex == DUPLEX_FULL)
1208 1208 __set_bit(BNX2X_LINK_REPORT_FD,
1209 /* Tx Flow Control is ON */ 1209 &data->link_report_flags);
1210 if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX) 1210
1211 __set_bit(BNX2X_LINK_REPORT_TX_FC_ON, &data->link_report_flags); 1211 /* Rx Flow Control is ON */
1212 if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_RX)
1213 __set_bit(BNX2X_LINK_REPORT_RX_FC_ON,
1214 &data->link_report_flags);
1215
1216 /* Tx Flow Control is ON */
1217 if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
1218 __set_bit(BNX2X_LINK_REPORT_TX_FC_ON,
1219 &data->link_report_flags);
1220 } else { /* VF */
1221 *data = bp->vf_link_vars;
1222 }
1212} 1223}
1213 1224
1214/** 1225/**
@@ -1262,6 +1273,10 @@ void __bnx2x_link_report(struct bnx2x *bp)
1262 */ 1273 */
1263 memcpy(&bp->last_reported_link, &cur_data, sizeof(cur_data)); 1274 memcpy(&bp->last_reported_link, &cur_data, sizeof(cur_data));
1264 1275
1276 /* propagate status to VFs */
1277 if (IS_PF(bp))
1278 bnx2x_iov_link_update(bp);
1279
1265 if (test_bit(BNX2X_LINK_REPORT_LINK_DOWN, 1280 if (test_bit(BNX2X_LINK_REPORT_LINK_DOWN,
1266 &cur_data.link_report_flags)) { 1281 &cur_data.link_report_flags)) {
1267 netif_carrier_off(bp->dev); 1282 netif_carrier_off(bp->dev);
@@ -3889,6 +3904,9 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
3889 /* set encapsulation flag in start BD */ 3904 /* set encapsulation flag in start BD */
3890 SET_FLAG(tx_start_bd->general_data, 3905 SET_FLAG(tx_start_bd->general_data,
3891 ETH_TX_START_BD_TUNNEL_EXIST, 1); 3906 ETH_TX_START_BD_TUNNEL_EXIST, 1);
3907
3908 tx_buf->flags |= BNX2X_HAS_SECOND_PBD;
3909
3892 nbd++; 3910 nbd++;
3893 } else if (xmit_type & XMIT_CSUM) { 3911 } else if (xmit_type & XMIT_CSUM) {
3894 /* Set PBD in checksum offload case w/o encapsulation */ 3912 /* Set PBD in checksum offload case w/o encapsulation */