diff options
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c')
| -rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 68 |
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) | |||
| 1186 | static void bnx2x_fill_report_data(struct bnx2x *bp, | 1188 | static 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 */ |
