diff options
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c')
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 69 |
1 files changed, 34 insertions, 35 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index 359e0f279b71..df6c6f51c609 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
@@ -13,7 +13,6 @@ | |||
13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
14 | #include <linux/aer.h> | 14 | #include <linux/aer.h> |
15 | 15 | ||
16 | #define QLCNIC_MAX_TX_QUEUES 1 | ||
17 | #define RSS_HASHTYPE_IP_TCP 0x3 | 16 | #define RSS_HASHTYPE_IP_TCP 0x3 |
18 | #define QLC_83XX_FW_MBX_CMD 0 | 17 | #define QLC_83XX_FW_MBX_CMD 0 |
19 | 18 | ||
@@ -268,20 +267,18 @@ int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *adapter, ulong addr, | |||
268 | } | 267 | } |
269 | } | 268 | } |
270 | 269 | ||
271 | int qlcnic_83xx_setup_intr(struct qlcnic_adapter *adapter, u8 num_intr, int txq) | 270 | int qlcnic_83xx_setup_intr(struct qlcnic_adapter *adapter) |
272 | { | 271 | { |
273 | int err, i, num_msix; | 272 | int err, i, num_msix; |
274 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 273 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
275 | 274 | ||
276 | if (!num_intr) | 275 | num_msix = adapter->drv_sds_rings; |
277 | num_intr = QLCNIC_DEF_NUM_STS_DESC_RINGS; | 276 | |
278 | num_msix = rounddown_pow_of_two(min_t(int, num_online_cpus(), | ||
279 | num_intr)); | ||
280 | /* account for AEN interrupt MSI-X based interrupts */ | 277 | /* account for AEN interrupt MSI-X based interrupts */ |
281 | num_msix += 1; | 278 | num_msix += 1; |
282 | 279 | ||
283 | if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) | 280 | if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) |
284 | num_msix += adapter->max_drv_tx_rings; | 281 | num_msix += adapter->drv_tx_rings; |
285 | 282 | ||
286 | err = qlcnic_enable_msix(adapter, num_msix); | 283 | err = qlcnic_enable_msix(adapter, num_msix); |
287 | if (err == -ENOMEM) | 284 | if (err == -ENOMEM) |
@@ -986,14 +983,14 @@ static int qlcnic_83xx_add_rings(struct qlcnic_adapter *adapter) | |||
986 | 983 | ||
987 | sds_mbx_size = sizeof(struct qlcnic_sds_mbx); | 984 | sds_mbx_size = sizeof(struct qlcnic_sds_mbx); |
988 | context_id = recv_ctx->context_id; | 985 | context_id = recv_ctx->context_id; |
989 | num_sds = (adapter->max_sds_rings - QLCNIC_MAX_RING_SETS); | 986 | num_sds = adapter->drv_sds_rings - QLCNIC_MAX_SDS_RINGS; |
990 | ahw->hw_ops->alloc_mbx_args(&cmd, adapter, | 987 | ahw->hw_ops->alloc_mbx_args(&cmd, adapter, |
991 | QLCNIC_CMD_ADD_RCV_RINGS); | 988 | QLCNIC_CMD_ADD_RCV_RINGS); |
992 | cmd.req.arg[1] = 0 | (num_sds << 8) | (context_id << 16); | 989 | cmd.req.arg[1] = 0 | (num_sds << 8) | (context_id << 16); |
993 | 990 | ||
994 | /* set up status rings, mbx 2-81 */ | 991 | /* set up status rings, mbx 2-81 */ |
995 | index = 2; | 992 | index = 2; |
996 | for (i = 8; i < adapter->max_sds_rings; i++) { | 993 | for (i = 8; i < adapter->drv_sds_rings; i++) { |
997 | memset(&sds_mbx, 0, sds_mbx_size); | 994 | memset(&sds_mbx, 0, sds_mbx_size); |
998 | sds = &recv_ctx->sds_rings[i]; | 995 | sds = &recv_ctx->sds_rings[i]; |
999 | sds->consumer = 0; | 996 | sds->consumer = 0; |
@@ -1028,7 +1025,7 @@ static int qlcnic_83xx_add_rings(struct qlcnic_adapter *adapter) | |||
1028 | mbx_out = (struct qlcnic_add_rings_mbx_out *)&cmd.rsp.arg[1]; | 1025 | mbx_out = (struct qlcnic_add_rings_mbx_out *)&cmd.rsp.arg[1]; |
1029 | index = 0; | 1026 | index = 0; |
1030 | /* status descriptor ring */ | 1027 | /* status descriptor ring */ |
1031 | for (i = 8; i < adapter->max_sds_rings; i++) { | 1028 | for (i = 8; i < adapter->drv_sds_rings; i++) { |
1032 | sds = &recv_ctx->sds_rings[i]; | 1029 | sds = &recv_ctx->sds_rings[i]; |
1033 | sds->crb_sts_consumer = ahw->pci_base0 + | 1030 | sds->crb_sts_consumer = ahw->pci_base0 + |
1034 | mbx_out->host_csmr[index]; | 1031 | mbx_out->host_csmr[index]; |
@@ -1086,10 +1083,10 @@ int qlcnic_83xx_create_rx_ctx(struct qlcnic_adapter *adapter) | |||
1086 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 1083 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
1087 | num_rds = adapter->max_rds_rings; | 1084 | num_rds = adapter->max_rds_rings; |
1088 | 1085 | ||
1089 | if (adapter->max_sds_rings <= QLCNIC_MAX_RING_SETS) | 1086 | if (adapter->drv_sds_rings <= QLCNIC_MAX_SDS_RINGS) |
1090 | num_sds = adapter->max_sds_rings; | 1087 | num_sds = adapter->drv_sds_rings; |
1091 | else | 1088 | else |
1092 | num_sds = QLCNIC_MAX_RING_SETS; | 1089 | num_sds = QLCNIC_MAX_SDS_RINGS; |
1093 | 1090 | ||
1094 | sds_mbx_size = sizeof(struct qlcnic_sds_mbx); | 1091 | sds_mbx_size = sizeof(struct qlcnic_sds_mbx); |
1095 | rds_mbx_size = sizeof(struct qlcnic_rds_mbx); | 1092 | rds_mbx_size = sizeof(struct qlcnic_rds_mbx); |
@@ -1190,7 +1187,7 @@ int qlcnic_83xx_create_rx_ctx(struct qlcnic_adapter *adapter) | |||
1190 | sds->crb_intr_mask = ahw->pci_base0 + intr_mask; | 1187 | sds->crb_intr_mask = ahw->pci_base0 + intr_mask; |
1191 | } | 1188 | } |
1192 | 1189 | ||
1193 | if (adapter->max_sds_rings > QLCNIC_MAX_RING_SETS) | 1190 | if (adapter->drv_sds_rings > QLCNIC_MAX_SDS_RINGS) |
1194 | err = qlcnic_83xx_add_rings(adapter); | 1191 | err = qlcnic_83xx_add_rings(adapter); |
1195 | out: | 1192 | out: |
1196 | qlcnic_free_mbx_args(&cmd); | 1193 | qlcnic_free_mbx_args(&cmd); |
@@ -1246,9 +1243,9 @@ int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *adapter, | |||
1246 | mbx.size = tx->num_desc; | 1243 | mbx.size = tx->num_desc; |
1247 | if (adapter->flags & QLCNIC_MSIX_ENABLED) { | 1244 | if (adapter->flags & QLCNIC_MSIX_ENABLED) { |
1248 | if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) | 1245 | if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) |
1249 | msix_vector = adapter->max_sds_rings + ring; | 1246 | msix_vector = adapter->drv_sds_rings + ring; |
1250 | else | 1247 | else |
1251 | msix_vector = adapter->max_sds_rings - 1; | 1248 | msix_vector = adapter->drv_sds_rings - 1; |
1252 | msix_id = ahw->intr_tbl[msix_vector].id; | 1249 | msix_id = ahw->intr_tbl[msix_vector].id; |
1253 | } else { | 1250 | } else { |
1254 | msix_id = QLCRDX(ahw, QLCNIC_DEF_INT_ID); | 1251 | msix_id = QLCRDX(ahw, QLCNIC_DEF_INT_ID); |
@@ -1271,7 +1268,8 @@ int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *adapter, | |||
1271 | qlcnic_pf_set_interface_id_create_tx_ctx(adapter, &temp); | 1268 | qlcnic_pf_set_interface_id_create_tx_ctx(adapter, &temp); |
1272 | 1269 | ||
1273 | cmd.req.arg[1] = QLCNIC_CAP0_LEGACY_CONTEXT; | 1270 | cmd.req.arg[1] = QLCNIC_CAP0_LEGACY_CONTEXT; |
1274 | cmd.req.arg[5] = QLCNIC_MAX_TX_QUEUES | temp; | 1271 | cmd.req.arg[5] = QLCNIC_SINGLE_RING | temp; |
1272 | |||
1275 | buf = &cmd.req.arg[6]; | 1273 | buf = &cmd.req.arg[6]; |
1276 | memcpy(buf, &mbx, sizeof(struct qlcnic_tx_mbx)); | 1274 | memcpy(buf, &mbx, sizeof(struct qlcnic_tx_mbx)); |
1277 | /* send the mailbox command*/ | 1275 | /* send the mailbox command*/ |
@@ -1286,7 +1284,7 @@ int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *adapter, | |||
1286 | tx->ctx_id = mbx_out->ctx_id; | 1284 | tx->ctx_id = mbx_out->ctx_id; |
1287 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && | 1285 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && |
1288 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { | 1286 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { |
1289 | intr_mask = ahw->intr_tbl[adapter->max_sds_rings + ring].src; | 1287 | intr_mask = ahw->intr_tbl[adapter->drv_sds_rings + ring].src; |
1290 | tx->crb_intr_mask = ahw->pci_base0 + intr_mask; | 1288 | tx->crb_intr_mask = ahw->pci_base0 + intr_mask; |
1291 | } | 1289 | } |
1292 | dev_info(&adapter->pdev->dev, "Tx Context[0x%x] Created, state:0x%x\n", | 1290 | dev_info(&adapter->pdev->dev, "Tx Context[0x%x] Created, state:0x%x\n", |
@@ -1297,7 +1295,7 @@ out: | |||
1297 | } | 1295 | } |
1298 | 1296 | ||
1299 | static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, | 1297 | static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, |
1300 | int num_sds_ring) | 1298 | u8 num_sds_ring) |
1301 | { | 1299 | { |
1302 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 1300 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
1303 | struct qlcnic_host_sds_ring *sds_ring; | 1301 | struct qlcnic_host_sds_ring *sds_ring; |
@@ -1313,7 +1311,7 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, | |||
1313 | 1311 | ||
1314 | qlcnic_detach(adapter); | 1312 | qlcnic_detach(adapter); |
1315 | 1313 | ||
1316 | adapter->max_sds_rings = 1; | 1314 | adapter->drv_sds_rings = QLCNIC_SINGLE_RING; |
1317 | adapter->ahw->diag_test = test; | 1315 | adapter->ahw->diag_test = test; |
1318 | adapter->ahw->linkup = 0; | 1316 | adapter->ahw->linkup = 0; |
1319 | 1317 | ||
@@ -1327,7 +1325,7 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, | |||
1327 | if (ret) { | 1325 | if (ret) { |
1328 | qlcnic_detach(adapter); | 1326 | qlcnic_detach(adapter); |
1329 | if (adapter_state == QLCNIC_ADAPTER_UP_MAGIC) { | 1327 | if (adapter_state == QLCNIC_ADAPTER_UP_MAGIC) { |
1330 | adapter->max_sds_rings = num_sds_ring; | 1328 | adapter->drv_sds_rings = num_sds_ring; |
1331 | qlcnic_attach(adapter); | 1329 | qlcnic_attach(adapter); |
1332 | } | 1330 | } |
1333 | netif_device_attach(netdev); | 1331 | netif_device_attach(netdev); |
@@ -1340,7 +1338,7 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, | |||
1340 | } | 1338 | } |
1341 | 1339 | ||
1342 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { | 1340 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { |
1343 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1341 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
1344 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; | 1342 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; |
1345 | qlcnic_83xx_enable_intr(adapter, sds_ring); | 1343 | qlcnic_83xx_enable_intr(adapter, sds_ring); |
1346 | } | 1344 | } |
@@ -1361,7 +1359,7 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, | |||
1361 | } | 1359 | } |
1362 | 1360 | ||
1363 | static void qlcnic_83xx_diag_free_res(struct net_device *netdev, | 1361 | static void qlcnic_83xx_diag_free_res(struct net_device *netdev, |
1364 | int max_sds_rings) | 1362 | u8 drv_sds_rings) |
1365 | { | 1363 | { |
1366 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 1364 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
1367 | struct qlcnic_host_sds_ring *sds_ring; | 1365 | struct qlcnic_host_sds_ring *sds_ring; |
@@ -1369,7 +1367,7 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev, | |||
1369 | 1367 | ||
1370 | clear_bit(__QLCNIC_DEV_UP, &adapter->state); | 1368 | clear_bit(__QLCNIC_DEV_UP, &adapter->state); |
1371 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { | 1369 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { |
1372 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1370 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
1373 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; | 1371 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; |
1374 | qlcnic_83xx_disable_intr(adapter, sds_ring); | 1372 | qlcnic_83xx_disable_intr(adapter, sds_ring); |
1375 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) | 1373 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) |
@@ -1393,7 +1391,7 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev, | |||
1393 | } | 1391 | } |
1394 | } | 1392 | } |
1395 | adapter->ahw->diag_test = 0; | 1393 | adapter->ahw->diag_test = 0; |
1396 | adapter->max_sds_rings = max_sds_rings; | 1394 | adapter->drv_sds_rings = drv_sds_rings; |
1397 | 1395 | ||
1398 | if (qlcnic_attach(adapter)) | 1396 | if (qlcnic_attach(adapter)) |
1399 | goto out; | 1397 | goto out; |
@@ -1655,7 +1653,8 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode) | |||
1655 | { | 1653 | { |
1656 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 1654 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
1657 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 1655 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
1658 | int ret = 0, loop = 0, max_sds_rings = adapter->max_sds_rings; | 1656 | u8 drv_sds_rings = adapter->drv_sds_rings; |
1657 | int ret = 0, loop = 0; | ||
1659 | 1658 | ||
1660 | if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { | 1659 | if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { |
1661 | netdev_warn(netdev, | 1660 | netdev_warn(netdev, |
@@ -1677,7 +1676,7 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode) | |||
1677 | mode == QLCNIC_ILB_MODE ? "internal" : "external"); | 1676 | mode == QLCNIC_ILB_MODE ? "internal" : "external"); |
1678 | 1677 | ||
1679 | ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST, | 1678 | ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST, |
1680 | max_sds_rings); | 1679 | drv_sds_rings); |
1681 | if (ret) | 1680 | if (ret) |
1682 | goto fail_diag_alloc; | 1681 | goto fail_diag_alloc; |
1683 | 1682 | ||
@@ -1715,10 +1714,10 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode) | |||
1715 | qlcnic_83xx_clear_lb_mode(adapter, mode); | 1714 | qlcnic_83xx_clear_lb_mode(adapter, mode); |
1716 | 1715 | ||
1717 | free_diag_res: | 1716 | free_diag_res: |
1718 | qlcnic_83xx_diag_free_res(netdev, max_sds_rings); | 1717 | qlcnic_83xx_diag_free_res(netdev, drv_sds_rings); |
1719 | 1718 | ||
1720 | fail_diag_alloc: | 1719 | fail_diag_alloc: |
1721 | adapter->max_sds_rings = max_sds_rings; | 1720 | adapter->drv_sds_rings = drv_sds_rings; |
1722 | qlcnic_release_diag_lock(adapter); | 1721 | qlcnic_release_diag_lock(adapter); |
1723 | return ret; | 1722 | return ret; |
1724 | } | 1723 | } |
@@ -3303,10 +3302,10 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev) | |||
3303 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 3302 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
3304 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 3303 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
3305 | struct qlcnic_cmd_args cmd; | 3304 | struct qlcnic_cmd_args cmd; |
3305 | u8 val, drv_sds_rings = adapter->drv_sds_rings; | ||
3306 | u32 data; | 3306 | u32 data; |
3307 | u16 intrpt_id, id; | 3307 | u16 intrpt_id, id; |
3308 | u8 val; | 3308 | int ret; |
3309 | int ret, max_sds_rings = adapter->max_sds_rings; | ||
3310 | 3309 | ||
3311 | if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { | 3310 | if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { |
3312 | netdev_info(netdev, "Device is resetting\n"); | 3311 | netdev_info(netdev, "Device is resetting\n"); |
@@ -3319,7 +3318,7 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev) | |||
3319 | } | 3318 | } |
3320 | 3319 | ||
3321 | ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST, | 3320 | ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST, |
3322 | max_sds_rings); | 3321 | drv_sds_rings); |
3323 | if (ret) | 3322 | if (ret) |
3324 | goto fail_diag_irq; | 3323 | goto fail_diag_irq; |
3325 | 3324 | ||
@@ -3356,10 +3355,10 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev) | |||
3356 | 3355 | ||
3357 | done: | 3356 | done: |
3358 | qlcnic_free_mbx_args(&cmd); | 3357 | qlcnic_free_mbx_args(&cmd); |
3359 | qlcnic_83xx_diag_free_res(netdev, max_sds_rings); | 3358 | qlcnic_83xx_diag_free_res(netdev, drv_sds_rings); |
3360 | 3359 | ||
3361 | fail_diag_irq: | 3360 | fail_diag_irq: |
3362 | adapter->max_sds_rings = max_sds_rings; | 3361 | adapter->drv_sds_rings = drv_sds_rings; |
3363 | qlcnic_release_diag_lock(adapter); | 3362 | qlcnic_release_diag_lock(adapter); |
3364 | return ret; | 3363 | return ret; |
3365 | } | 3364 | } |
@@ -3513,7 +3512,7 @@ int qlcnic_83xx_resume(struct qlcnic_adapter *adapter) | |||
3513 | if (err) | 3512 | if (err) |
3514 | return err; | 3513 | return err; |
3515 | 3514 | ||
3516 | if (ahw->nic_mode == QLC_83XX_VIRTUAL_NIC_MODE) { | 3515 | if (ahw->nic_mode == QLCNIC_VNIC_MODE) { |
3517 | if (ahw->op_mode == QLCNIC_MGMT_FUNC) { | 3516 | if (ahw->op_mode == QLCNIC_MGMT_FUNC) { |
3518 | qlcnic_83xx_set_vnic_opmode(adapter); | 3517 | qlcnic_83xx_set_vnic_opmode(adapter); |
3519 | } else { | 3518 | } else { |